Javascript 如何使用array includes函数检查对象数组中的对象相等性?

Javascript 如何使用array includes函数检查对象数组中的对象相等性?,javascript,arrays,object,equality,Javascript,Arrays,Object,Equality,我想检查一个数组是否有作为js includes函数参数的对象。例如: let arr = [ {'name': 'max', 'age': '20'}, {'name': 'max', 'age': '21'}, {'name': 'jane', 'age': '22'}]; console.log(arr.includes({'name': 'max', 'age': '21'})); // FALSE 这给了我“假”值。如何在没有for循环等式的情况下检查对象数组

我想检查一个数组是否有作为js includes函数参数的对象。例如:

let arr = [
    {'name': 'max', 'age': '20'},
    {'name': 'max', 'age': '21'},
    {'name': 'jane', 'age': '22'}];
console.log(arr.includes({'name': 'max', 'age': '21'})); // FALSE

这给了我“假”值。如何在没有for循环等式的情况下检查对象数组中的对象相等性。

您不能使用
includes
执行此操作,因为您不处理相等性检查,并且对象不同,因此没有匹配项

要做您想做的事情,您可以使用
some
find

让arr=[
{'name':'max','age':'20'},
{'name':'max','age':'21'},
{'name':'jane','age':'22'}
];
log(arr.some(({name,age})=>name=='max'&&age=='21');

console.log(!!arr.find(({name,age})=>name=='max'&&age=='21')以下是实现相同结果的另一种方法:

如果对象的结构在以前不太清楚,即当它们从API或其他东西动态更改时,那么您可以使用以下解决方案

让arr=[
{'name':'max','age':'20'},
{'name':'max','age':'21'},
{'name':'jane','age':'22'}
];
设x={'name':'max','age':'20'};
让result=arr.map(ele=>JSON.stringify(ele)).includes(JSON.stringify(x));

console.log(result)
这里有一个选项,它同时依赖于
。一些
。条目
,以确保传递的所有
键值对都存在并且在目标数组中匹配。
这也将忽略键的顺序,并接受动态输入

本例假设,如果提供的密钥较少,则只检查这些密钥。例如,仅检查
{'name':'max'}
将返回true

让arr=[
{'name':'max','age':'20'},
{'name':'max','age':'21'},
{'name':'jane','age':'22'}];
功能包括数据线(查找,arr){
//确保每个查找都匹配。
返回\u arr.some(i=>{
//循环键值对。
返回Object.entries(查找).every([key,value])=>{
返回i[键]==值;
});
});
};
console.log(包括InArray({
'name':'max',
‘年龄’:‘21’
},arr));//应该返回true。
console.log(包括InArray({
"年龄":"21",,
“name”:“max”
},arr));//应该返回true。
console.log(包括InArray({
‘年龄’:‘55’,
“name”:“max”
},arr));//应该返回false。
console.log(包括InArray({
“name”:“max”

},arr));//应该返回true。
您可以编写一个通用函数,如

let matches = flt => x => Object.keys(flt).every(k => flt[k] === x[k]);
然后

arr.some(matches({'name': 'max', 'age': '21'}))

这将执行肤浅的部分比较。如果您需要其他模式,比如完全比较和/或深度比较,那么实现起来要困难得多。在这种情况下,我建议使用lodash(
.isMatching
.isEqual
)。

如果你知道对象的结构,关键是要精确,那么你可以继续使用sjahan的解决方案。因为
一些
查找
在参数中使用函数,您可以轻松实现您想要/需要的任何“平等性检查功能”。尽管如此,在不知道处理/比较什么的情况下工作可能会有性能成本。拥有一个深入到两个对象的“通用”比较功能很酷,但可能很昂贵。如果这不能回答您的问题,请告诉我,我将删除它。您可以添加:3。不适用于圆形结构。我比我的更喜欢这个,做得好。是否有任何理由使用
而不是
条目
?我的意思是,我很确定它会是一样的,只是想知道。@briosheje:没有特别的原因,除了
的支持范围稍宽。