将两个数组与具有无序键的对象进行比较
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));
我知道它们是指示如何执行此操作的几个问题,但是,当对象的键顺序不同时,提供的解决方案将不起作用。
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));