我想检查一个数组是否有作为js参数包含函数的对象。例如:
let arr = [
{'name': 'max', 'age': '20'},
{'name': 'max', 'age': '21'},
{'name': 'jane', 'age': '22'}];
console.log(arr.includes({'name': 'max', 'age': '21'})); // FALSE
那给了我“假”的价值。如何在没有for循环eq的情况下检查对象数组中的对象相等性。
答案 0 :(得分:3)
您可以编写通用函数,如
let matches = flt => x => Object.keys(flt).every(k => flt[k] === x[k]);
然后
arr.some(matches({'name': 'max', 'age': '21'}))
这将执行浅层,部分比较。如果您需要其他模式,例如完整和/或深度比较,则实施起来会比较棘手。我建议在这种情况下使用lodash(_.isMatching
,_.isEqual
)。
答案 1 :(得分:2)
您无法使用includes
来执行此操作,因为您不处理相等性检查并且对象不同,因此没有匹配项。
要执行所需的操作,可以使用some
或find
!
let arr = [
{'name': 'max', 'age': '20'},
{'name': 'max', 'age': '21'},
{'name': 'jane', 'age': '22'}
];
console.log(arr.some(({name, age}) => name === 'max' && age === '21'));
console.log(!!arr.find(({name, age}) => name === 'max' && age === '21'));
请注意,find
返回了该对象,我添加了!!
以打印布尔结果,但这不一定是必需的。
答案 2 :(得分:2)
这是获得相同结果的另一种方法:
如果以前不太了解对象的结构,即当它们从API或其他东西动态更改时,则可以使用以下解决方案
let arr = [
{'name': 'max', 'age': '20'},
{'name': 'max', 'age': '21'},
{'name': 'jane', 'age': '22'}
];
let x = {'name': 'max', 'age': '20'};
let result =arr.map( ele => JSON.stringify(ele)).includes(JSON.stringify(x));
console.log(result)
上述解决方案也适用于嵌套对象。
注意 该解决方案有两个警告
x
对象中保持不变,就可以使用编辑1
答案 3 :(得分:2)
这是一个同时依赖.some
和.entries
的选项,以确保所有传递的key-value
对都存在并且在目标数组内匹配。
这也将忽略键的顺序,并接受动态输入。
此示例假定如果提供的密钥较少,则仅选中这些密钥。例如,仅检查{'name': 'max'}
将返回true。
let arr = [
{'name': 'max', 'age': '20'},
{'name': 'max', 'age': '21'},
{'name': 'jane', 'age': '22'}];
function includedInArray(lookups, _arr) {
// Ensure every lookup match.
return _arr.some(i => {
// Loop key-value pairs.
return Object.entries(lookups).every(([key, value]) => {
return i[key] === value;
});
});
};
console.log(includedInArray({
'name': 'max',
'age': '21'
}, arr)); // should return true.
console.log(includedInArray({
'age': '21',
'name': 'max'
}, arr)); // should return true.
console.log(includedInArray({
'age': '55',
'name': 'max'
}, arr)); // should return false.
console.log(includedInArray({
'name': 'max'
}, arr)); // should return true.