我有两个 JavaScript 数组(
A
和 B
),其中包含我创建的对象。我想检查数组 A
中的所有对象是否都包含在数组 B
中,但不一定按相同的顺序。
最好的方法是什么?
编辑:
它们都是实际对象,而不是基元,所以我还需要比较它们的内容和结构(也许使用类似
JSON.stringify
之类的东西)。
我想这样做是因为我正在学习测试驱动开发,并且我想测试返回对象列表的函数。我需要测试返回的列表中是否包含预期的对象(在这种情况下顺序并不重要)。
使用 ES6,你可以使用每一个和一些(和长度)。
let A = [1, 2, 3];
let B = [2, 3, 1];
// all objects in A are contained in B (A ⊆ B)
// you can compare a <-> b however you'd like (here just `a === b`)
let AsubB = A.every(a => B.some(b => a === b));
// A and B are the same length
let sameLength = A.length === B.length;
// their contents are as equal as previously tested:
let equal = AsubB && sameLength;
用途:
isEqArrays(arr1, arr2)
//
// Array comparsion
//
function inArray(array, el) {
for ( var i = array.length; i--; ) {
if ( array[i] === el ) return true;
}
return false;
}
function isEqArrays(arr1, arr2) {
if ( arr1.length !== arr2.length ) {
return false;
}
for ( var i = arr1.length; i--; ) {
if ( !inArray( arr2, arr1[i] ) ) {
return false;
}
}
return true;
}
这可能是最简单的方法,即使不是最慢的方法。
var o = { PropA: 1, PropB: 2 };
var a = [1, 2, 3, 4, o];
var b = [2, 3, 4, 1];
var c = a.filter(function(value, index, obj) {
return b.indexOf(value) > -1;
});
if (c.length !== a.length) {
throw new Error("Array b is missing some elements!");
}
indexOf
只会检查它们是否引用同一个对象。如果您想检查值等价性,则必须对属性进行深入比较或使用 JSON.stringify
,正如您在问题中提到的那样。
简约优雅
function isEqual(arr1, arr2) {
if (arr1.length !== arr2.length)
return false;
return arr1.every(x => arr2.includes(x));
}
如果重复很重要,请使用这个
function isEqual(arr1, arr2) {
if (arr1.length !== arr2.length)
return false;
arr1.sort();
arr2.sort();
for (var i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i])
return false;
}
return true;
}
嗨,这似乎比我想象的要困难,我需要自己编写代码。请检查我的解决方案:
//usage
alert(compareTwoArray([0, 0, 1, 1], [1, 0, 1, 0]));
function compareTwoArray(arr1, arr2) {
if (arr1.length != arr2.length || arr1.length == arr2.length == 0) {
return false;
}
//clone arr to process
let arr01 = JSON.parse(JSON.stringify(arr1));
let arr02 = JSON.parse(JSON.stringify(arr2));
for (let i = (arr01.length - 1); i >= 0; i--) {
for (let j = (arr01.length - 1); j >= 0; j--) {
if (arr01[i] == arr02[j]) {
//remove duplicate item from both array
arr01.splice(i, 1);
arr02.splice(j, 1);
}
}
}
if (arr01.length == 0 && arr02.length == 0) {
return true;
} else {
return false;
}
}