如何使用数组包含函数检查对象数组中的对象相等性?

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 执行此操作,因为您不处理相等性检查并且对象不同,因此没有任何匹配项。

做你想做的,你可以使用 somefind !

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)

上述解决方案也适用于嵌套对象。

备注 该解决方案有两个注意事项

  1. 只要键的顺序在整个数组中以及 x 对象(您希望比较的对象)中保持不变,它就可以工作
  2. 如果你的对象中有太多的嵌套那么它会很慢。我不会向任何关心性能的人推荐 JSON.stringify。

编辑 1

  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)。