我有一系列字典(来自服务器)。然后我从数据库中得到一个字典 - 我需要在数组中找到一个这个字典(来自数据库)。
array.indexOf(dict)
- 它不起作用,我认为这是因为字典有不同的隐藏字段
获取并比较字符串(toString()
) - 不起作用
如果使用过滤器:
array.filter(function(dictFromArr){
return dictFromArr.id == dict.id && ...
});
不适合,因为这么多领域。
有谁知道如何比较字典?
答案 0 :(得分:0)
要搜索数组,您必须使用O(n)操作遍历它,因此filter是一个可行的选项。在找到对象时返回的算法有时会提高性能,但最差的演员场景(找不到项目)仍为O(n):
function getObjectFromArray(array, object) {
for(var i = 0; i < array.length; i++) { // traverse the array
if(array[i].id === object.id) { // compare ids
return array[i]; // if id exist return element
}
}
return null; // if not found return null
}
用法:
getObjectFromArray(array, dict);
答案 1 :(得分:0)
我想您可以尝试将每个数组字典的键和值的数组与模型字典进行比较。效率不高但完成任务:
// return the object keys
function getKeys(obj) {
return Object.keys(obj);
}
// using the keys, return the object values
function getVals(keys, obj) {
return keys.map(function (el) {
return obj[el];
});
}
function isMatch(arr1, arr2) {
// match the array lengths and that the values at each
// index in arr1 match those in arr2
return arr1.length === arr2.length && arr1.every(function (el, i) {
return arr1[i] === arr2[i];
});
}
function find(arr, obj) {
// grab the object keys and values
var oKeys = getKeys(obj);
var oVals = getVals(oKeys, obj);
// filter out the object where both the keys and
// the values match
return arr.filter(function (c) {
var cKeys = getKeys(c);
var cVals = getVals(cKeys, c);
return isMatch(oKeys, cKeys) && isMatch(oVals, cVals);
})[0] || 'no match';
}
find(arr, obj);
答案 2 :(得分:0)
那是因为indexOf
uses strict comparison(===
)所以即使[{a:1}].indexOf({a:1})
也会返回-1
。
比较字符串是一个坏主意(因为toString
默认返回[Object object]
)。即使比较JSON字符串也是一个坏主意,因为JSON.stringify({b:1,a:1}) !== JSON.stringify({a:1,b:1})
虽然对象显然是相等的。
如果您愿意将新库添加到项目中,可以使用lodash with its _.isEqual
and _.find
functions。请注意,如果您不想使用整个lodash,您可以使用lodash.isequal
npm package(并且lodash中的每个其他函数都有一个单独的包)。
或者,您可以编写递归函数来比较它们。该函数将遍历对象中的所有键,如果值都是对象,则应该递归。但是这样,imho只是作为编程练习才有意义(仍然是一个好的练习)。
另请参阅this great answer以获取有关比较JS中对象的更多详细信息(请注意代码的大小!这就是您可能不希望自己实现它的原因。)