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

时间:2019-06-20 13:02:21

标签: javascript arrays object equality

我想检查一个数组是否有作为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的情况下检查对象数组中的对象相等性。

4 个答案:

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

要执行所需的操作,可以使用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返回了该对象,我添加了!!以打印布尔结果,但这不一定是必需的。

答案 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)

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

注意 该解决方案有两个警告

  1. 只要您的键顺序在整个数组中以及您要比较的x对象中保持不变,就可以使用
  2. 如果您的对象中嵌套过多,那么它将非常缓慢。我不会向任何关心性能的人推荐JSON.stringify。

编辑1

  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.