如何使用数组包含函数检查对象数组中的对象相等性?
How can I check object equality in object array with using array includes function?
我想检查一个数组是否包含作为参数提供给 js 的对象包含函数。例如:
let arr = [
{'name': 'max', 'age': '20'},
{'name': 'max', 'age': '21'},
{'name': 'jane', 'age': '22'}];
console.log(arr.includes({'name': 'max', 'age': '21'})); // FALSE
那给我 "false" 价值。如何在没有 for 循环 eq.
的情况下检查对象数组中的对象相等性
您不能使用 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
returns 对象,我添加了 !!
来打印布尔结果,但这不一定是强制性的。
这是实现相同结果的另一种方法:
如果对象的结构以前不是很清楚,即当它们动态变化时,从 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
对象(您希望比较的对象)中保持不变,它就可以工作
- 如果你的对象中有太多的嵌套那么它会很慢。我不会向任何关心性能的人推荐 JSON.stringify。
编辑 1
- 不适用于圆形结构
这是一个依赖于 .some
和 .entries
的选项,以确保传递的所有 key-value
对都存在并且在目标数组中匹配。
这也将忽略键的顺序,并接受动态输入。
此示例假设如果提供的密钥较少,则仅检查这些密钥。例如,检查 {'name': 'max'}
只会 return 为真。
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.
您可以编写一个通用函数,例如
let matches = flt => x => Object.keys(flt).every(k => flt[k] === x[k]);
然后
arr.some(matches({'name': 'max', 'age': '21'}))
这会执行浅层的、局部的比较。如果您需要其他模式,如完整 and/or 深度比较,这将难以实现。我建议在这种情况下使用 lodash (_.isMatching
, _.isEqual
)。
我想检查一个数组是否包含作为参数提供给 js 的对象包含函数。例如:
let arr = [
{'name': 'max', 'age': '20'},
{'name': 'max', 'age': '21'},
{'name': 'jane', 'age': '22'}];
console.log(arr.includes({'name': 'max', 'age': '21'})); // FALSE
那给我 "false" 价值。如何在没有 for 循环 eq.
的情况下检查对象数组中的对象相等性您不能使用 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
returns 对象,我添加了 !!
来打印布尔结果,但这不一定是强制性的。
这是实现相同结果的另一种方法:
如果对象的结构以前不是很清楚,即当它们动态变化时,从 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
对象(您希望比较的对象)中保持不变,它就可以工作 - 如果你的对象中有太多的嵌套那么它会很慢。我不会向任何关心性能的人推荐 JSON.stringify。
编辑 1
- 不适用于圆形结构
这是一个依赖于 .some
和 .entries
的选项,以确保传递的所有 key-value
对都存在并且在目标数组中匹配。
这也将忽略键的顺序,并接受动态输入。
此示例假设如果提供的密钥较少,则仅检查这些密钥。例如,检查 {'name': 'max'}
只会 return 为真。
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.
您可以编写一个通用函数,例如
let matches = flt => x => Object.keys(flt).every(k => flt[k] === x[k]);
然后
arr.some(matches({'name': 'max', 'age': '21'}))
这会执行浅层的、局部的比较。如果您需要其他模式,如完整 and/or 深度比较,这将难以实现。我建议在这种情况下使用 lodash (_.isMatching
, _.isEqual
)。