Javascript数组-检查两个对象数组的相同内容,忽略顺序

Javascript数组-检查两个对象数组的相同内容,忽略顺序,javascript,arrays,comparison,compare,Javascript,Arrays,Comparison,Compare,我有两个JavaScript数组(A和B)包含我创建的对象。我想检查数组A中的所有对象是否都包含在数组B中,但顺序不一定相同 最好的方法是什么 编辑: 它们都是实际的对象,而不是原语,因此我还需要比较它们的内容和结构(可能使用类似于JSON.stringify) 我想这样做是因为我正在学习测试驱动开发,我想测试返回对象列表的函数。我需要测试返回的列表中是否包含预期的对象(在这种情况下顺序并不重要)。这可能是最简单的方法,如果不是最慢的 var o = { PropA: 1, PropB: 2 }

我有两个JavaScript数组(
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;