如何检查两个对象数组是否等于 javascript?
How can i check if two arrays of objects are equal with javascript?
我有两个要比较的对象数组。如果数组具有相同的对象,即使它们的顺序不同,则数组是相等的。例如:
[
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
{ name: 'jhon', value: '50', height: 176 }
]
//and
[
{ name: 'jhon', value: '50', height: 176 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190}
]
//equals
相等但
[
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
{ name: 'jhon', value: '50', height: 176 }
]
//and
[
{ name: 'jhon', value: '50', height: 176 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
{ name: 'Mark', value: '50', height: 140 }
]
//not equal
和
[
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
{ name: 'jhon', value: '50', height: 176 }
]
//and
[
{ name: 'jhon', value: '50' },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
]
//not equals
最后一个例子中的两个数组不相等,因为它们没有完全相同的对象。我尝试了很多不需要展示的东西,因为我还没有接近 javascript
谢谢你的帮助:)
此处可能的答案是对数组进行排序(基于一些 属性 以便在第二步中完美匹配)和 stringify
数组进行比较。
function areArrayEqual(arrayA, arrayB) {
if (arrayA.length !== arrayB.length) {
return false;
}
return JSON.stringify(arrayA) === JSON.stringify(arrayB);
}
在这里,检查长度,然后排序和比较。
const arr1 = [
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
{ name: 'jhon', value: '50', height: 176 }
];
const arr2 = [
{ name: 'jhon', value: '50', height: 176 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190}
];
const arr3 = [
{ name: 'jhon', value: '50', height: 176 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
{ name: 'Mark', value: '50', height: 140 }
];
const arr4 = [
{ name: 'jhon', value: '50', height: 176, extraField: 1 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190}
];
const sortByName = (arr) => arr.sort(({ name: a}, {name: b}) => (a > b) ? 1 : (a < b) ? -1 : 0 );
const objEqual = (objA, objB) => {
const keys = [...new Set(Object.keys(objA).concat(Object.keys(objB)))];
if (keys.length !== Object.keys(objA).length) return false;
return keys.every(k => objA[k] === objB[k]);
}
const areEqual = (arrA, arrB) => {
if (arrA.length !== arrB.length) return false;
const a = sortByName(arrA);
const b = sortByName(arrB);
return a.every((obj, i) => objEqual(obj, b[i]));
};
console.log(areEqual(arr1, arr2));
console.log(areEqual(arr1, arr3));
console.log(areEqual(arr1, arr4));
测试后的另一个选项Length
。就是用一个Set
.
const arr1 = [
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12', height: 190},
{ name: 'jhon', value: '50', height: 176 }
];
const arr2 = [
{ name: 'jhon', value: '50', height: 176 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12', height: 190}
];
const arr3 = [
{ name: 'jhon', value: '50', height: 176 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12', height: 190},
{ name: 'Mark', value: '50', height: 140 }
];
const arr4 = [
{ name: 'jhon', value: '50', height: 176, extraField: 1 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190}
];
const getKey = (obj) => {
return Object.keys(obj).map(k => `${k}:${obj[k]}`).join('');
};
const areEqual = (arr1, arr2) => {
// First test length
if(arr1.length !== arr2.length) return false;
// Now lets grab a sets
const names = new Set(arr1.concat(arr2).map((obj) => getKey(obj)));
// now check Set length === arr1.length
return (names.size * 2) === arr1.length + arr2.length;
};
console.log(areEqual(arr1, arr2));
console.log(areEqual(arr1, arr3));
console.log(areEqual(arr1, arr4));
我有两个要比较的对象数组。如果数组具有相同的对象,即使它们的顺序不同,则数组是相等的。例如:
[
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
{ name: 'jhon', value: '50', height: 176 }
]
//and
[
{ name: 'jhon', value: '50', height: 176 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190}
]
//equals
相等但
[
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
{ name: 'jhon', value: '50', height: 176 }
]
//and
[
{ name: 'jhon', value: '50', height: 176 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
{ name: 'Mark', value: '50', height: 140 }
]
//not equal
和
[
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
{ name: 'jhon', value: '50', height: 176 }
]
//and
[
{ name: 'jhon', value: '50' },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
]
//not equals
最后一个例子中的两个数组不相等,因为它们没有完全相同的对象。我尝试了很多不需要展示的东西,因为我还没有接近 javascript 谢谢你的帮助:)
此处可能的答案是对数组进行排序(基于一些 属性 以便在第二步中完美匹配)和 stringify
数组进行比较。
function areArrayEqual(arrayA, arrayB) {
if (arrayA.length !== arrayB.length) {
return false;
}
return JSON.stringify(arrayA) === JSON.stringify(arrayB);
}
在这里,检查长度,然后排序和比较。
const arr1 = [
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
{ name: 'jhon', value: '50', height: 176 }
];
const arr2 = [
{ name: 'jhon', value: '50', height: 176 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190}
];
const arr3 = [
{ name: 'jhon', value: '50', height: 176 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190},
{ name: 'Mark', value: '50', height: 140 }
];
const arr4 = [
{ name: 'jhon', value: '50', height: 176, extraField: 1 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190}
];
const sortByName = (arr) => arr.sort(({ name: a}, {name: b}) => (a > b) ? 1 : (a < b) ? -1 : 0 );
const objEqual = (objA, objB) => {
const keys = [...new Set(Object.keys(objA).concat(Object.keys(objB)))];
if (keys.length !== Object.keys(objA).length) return false;
return keys.every(k => objA[k] === objB[k]);
}
const areEqual = (arrA, arrB) => {
if (arrA.length !== arrB.length) return false;
const a = sortByName(arrA);
const b = sortByName(arrB);
return a.every((obj, i) => objEqual(obj, b[i]));
};
console.log(areEqual(arr1, arr2));
console.log(areEqual(arr1, arr3));
console.log(areEqual(arr1, arr4));
测试后的另一个选项Length
。就是用一个Set
.
const arr1 = [
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12', height: 190},
{ name: 'jhon', value: '50', height: 176 }
];
const arr2 = [
{ name: 'jhon', value: '50', height: 176 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12', height: 190}
];
const arr3 = [
{ name: 'jhon', value: '50', height: 176 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12', height: 190},
{ name: 'Mark', value: '50', height: 140 }
];
const arr4 = [
{ name: 'jhon', value: '50', height: 176, extraField: 1 },
{ name: 'Lisa', value: '25', height: 165 },
{ name: 'jack', value: '12 ', height: 190}
];
const getKey = (obj) => {
return Object.keys(obj).map(k => `${k}:${obj[k]}`).join('');
};
const areEqual = (arr1, arr2) => {
// First test length
if(arr1.length !== arr2.length) return false;
// Now lets grab a sets
const names = new Set(arr1.concat(arr2).map((obj) => getKey(obj)));
// now check Set length === arr1.length
return (names.size * 2) === arr1.length + arr2.length;
};
console.log(areEqual(arr1, arr2));
console.log(areEqual(arr1, arr3));
console.log(areEqual(arr1, arr4));