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

问题描述 投票:0回答:5

我有两个 JavaScript 数组(

A
B
),其中包含我创建的对象。我想检查数组
A
中的所有对象是否都包含在数组
B
中,但不一定按相同的顺序。

最好的方法是什么?

编辑:

它们都是实际对象,而不是基元,所以我还需要比较它们的内容和结构(也许使用类似

JSON.stringify
之类的东西)。

我想这样做是因为我正在学习测试驱动开发,并且我想测试返回对象列表的函数。我需要测试返回的列表中是否包含预期的对象(在这种情况下顺序并不重要)。

javascript arrays comparison compare
5个回答
5
投票

使用 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;

3
投票

用途:

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;
}

2
投票

这可能是最简单的方法,即使不是最慢的方法。

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
,正如您在问题中提到的那样。


0
投票

简约优雅

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;
}

0
投票

嗨,这似乎比我想象的要困难,我需要自己编写代码。请检查我的解决方案:

//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;
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.