代码之家  ›  专栏  ›  技术社区  ›  Chetan

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

  •  13
  • Chetan  · 技术社区  · 14 年前

    我有两个JavaScript数组( A B )包含我创建的对象。我要检查数组中的所有对象 A B ,但顺序不一定相同。

    JSON.stringify ).

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

    4 回复  |  直到 14 年前
        1
  •  2
  •   gblazex    14 年前

    用法: 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
  •  4
  •   SeregPie    6 年前

    如果副本不重要,您可以使用 lodash

    if (_(array).difference(otherArray).isEmpty()) {
        // is equal ignoring order and duplicates
    }
    
    console.log(_([1,2,3]).difference([2,3,1]).isEmpty()) // -> true
    console.log(_([1,2,3,3]).difference([2,3,1,1]).isEmpty()) // -> also true
    
        3
  •  3
  •   Jari Keinänen Roberto Canogar    6 年前

    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;
    
        4
  •  1
  •   ChaosPandion    14 年前

    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 正如你在问题中提到的。