将两个数组与具有无序键的对象进行比较

Comparing two arrays with objects with unordered keys

我知道它们是指示如何执行此操作的几个问题,但是,当对象的键顺序不同时,提供的解决方案将不起作用。

let array1 = [
  { name: 'David', age: 30 },
  { name: 'Amy', age: 39 }
];

let array2 = [
  { age: 30, name: 'David' },
  { age: 39, name: 'Amy' }
];

比较数组

console.log(array1.every((value, index) => {
   return JSON.stringify(value) === JSON.stringify(array2[index]);
})

// Returns false
// Expected true

可以理解,这两个数组不同,但数据相同。所以...

如何将数组与无法保证键顺序相同的对象进行比较?

您可以进行适当的对象比较,a lot of ways 可以做到这一点。

以下是示例之一:

let array1 = [
  { name: 'David', age: 30 },
  { name: 'Amy', age: 39 }
];

let array2 = [
  { age: 30, name: 'David' },
  { age: 39, name: 'Amy' }
];

console.log(array1.every((value, index) => 
  Object.keys(value).length === Object.keys(array2[index]).length &&
  JSON.stringify(value) === JSON.stringify({...value, ...array2[index]})
));

1) 将对象数组转换为字符串数组
2) 比较两个字符串数组(一种方法是使用 reduce,如下所示)。

let array1 = [
  { name: "David", age: 30 },
  { name: "Amy", age: 39 }
];

let array2 = [
  { age: 30, name: "David" },
  { age: 39, name: "Amy" }
];


const isEqual = (arr1, arr2) => {
  if (arr1.length !== arr2.length) {
    return false;
  }
  const toStr = ({ name, age }) => `${name}-${age}`;
  const a1 = Array.from(arr1, toStr);
  const a2 = Array.from(arr2, toStr);
  return a1.every(item => a2.includes(item));
};

console.log(isEqual(array1, array2));