Javascript数组-检查两个对象数组的相同内容,忽略顺序
我有两个JavaScript数组(Javascript数组-检查两个对象数组的相同内容,忽略顺序,javascript,arrays,comparison,compare,Javascript,Arrays,Comparison,Compare,我有两个JavaScript数组(A和B)包含我创建的对象。我想检查数组A中的所有对象是否都包含在数组B中,但顺序不一定相同 最好的方法是什么 编辑: 它们都是实际的对象,而不是原语,因此我还需要比较它们的内容和结构(可能使用类似于JSON.stringify) 我想这样做是因为我正在学习测试驱动开发,我想测试返回对象列表的函数。我需要测试返回的列表中是否包含预期的对象(在这种情况下顺序并不重要)。这可能是最简单的方法,如果不是最慢的 var o = { PropA: 1, PropB: 2 }
A
和B
)包含我创建的对象。我想检查数组A
中的所有对象是否都包含在数组B
中,但顺序不一定相同
最好的方法是什么
编辑:
它们都是实际的对象,而不是原语,因此我还需要比较它们的内容和结构(可能使用类似于JSON.stringify
)
我想这样做是因为我正在学习测试驱动开发,我想测试返回对象列表的函数。我需要测试返回的列表中是否包含预期的对象(在这种情况下顺序并不重要)。这可能是最简单的方法,如果不是最慢的
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
。用法:isEqArrays(arr1,arr2)
如果副本不重要,可以使用创建一行。查看两个数组之间的差异是否为空
if((数组).difference(其他数组).isEmpty()){
//忽略顺序和重复项等于
}
console.log(([1,2,3])。差异([2,3,1])。isEmpty())/->true
console.log(([1,2,3,3])。difference([2,3,1,1])。isEmpty())/->也是真的
使用ES6,您可以使用每个和一些(和长度)
设A=[1,2,3];
设B=[2,3,1];
//A中的所有对象都包含在B(A)中⊆ (B)
//你可以随意比较a和b(这里只需'a==b`)
设AsubB=A.every(A=>B.some(B=>A==B));
//A和B的长度相同
设SameleLength=A.length==B.length;
//其内容物与之前测试的内容物相同:
设equal=AsubB&&SameleLength;
它们是诸如true
、false
、23
之类的基本体还是实际对象?你能解释一下你为什么要这么做吗?可能有更好的方法。请编辑问题进行澄清。为什么不先排序,然后使用JSON.stringify进行比较?实际上,您可以通过引用来比较对象。您正在比较的对象有多复杂?它们是否也有您需要检查的特性(方法等)?.indexOf
是否也检查对象等效性?例如,如果我做一个o2={PropA:2,PropB:2}
并把它放在b
中,它会返回-1
以外的内容吗?与另一个答案一样,这会返回[0,1,1]
和[0,0,1]
的假阳性。这比@ChaosPandion的解决方案快吗?它是跨浏览器的。混沌的不是。他使用的语言功能还没有得到很好的支持。此代码不起作用:IseQarray([0,0,1],[0,1,1])
返回true
。即使使用两个方向,检查包含也不会考虑多个相等的元素;例如,考虑[1,2,3,3]和[1,2,2,3]。检查两个对象属性是很好的;此外,在问题中,不要求检查重复。我把它和一个包含日期和时间的对象一起使用,效果很好。
//
// 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;
}
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;