以递归方式比较javascript中的对象数组

时间:2016-07-01 19:31:58

标签: javascript arrays

我做了一个返回一个对象数组的ajax调用。该数组可以包含1个对象或20个,在进行调用之前不知道。

对象将具有相同的属性但值不同。 我可以比较两个这样的对象:

function compareObjects(x, y) {
   var objectsAreSame = true;
   for(var propertyName in x) {
      if(x[propertyName] !== y[propertyName]) {
         objectsAreSame = false;
         break;
      }
   }
   return objectsAreSame;
}

如何扩展它以比较多个对象或有更好的比较方法?

编辑#1类似的问题: Object comparison in JavaScript

但是,我并不想比较两个对象,我试图找到比较未知对象数组的最短方法。我为任何困惑道歉。

编辑#2我不是在问如何比较两个对象。我问如何获取未知数量的数组并比较内部的每个对象并检查每个对象是否相同。

like arrayofObjects [obj1,obj2 ... objn] 最简单的说obj1的方式,通过objn是完全一样的。

5 个答案:

答案 0 :(得分:1)

保持你的功能(它非常简单,但让我们假设它适用于你的用例):

const sameArray = (newArray.length === oldArray.length) && newArray.every((item, index) =>
  compareObjects(item, oldArray[index])
)

答案 1 :(得分:1)

Stringify' em!

var same = JSON.stringify(x) === JSON.stringify(y);

编辑: OP的轻微编辑可以稍微改变这个答案。我以为他想知道obj1 === obj2(如果他们完全一样)。如果属性可以处于不同的顺序并且仍然可以考虑"相同"对于他的用例。

答案 2 :(得分:1)

我会使用通用方法Object.prototype.compare()执行此操作,如下所示

Object.prototype.compare = function(o){
  var ok = Object.keys(this);
  return typeof o === "object" && ok.length === Object.keys(o).length ? ok.every(k => this[k] === o[k]) : false;
};

答案 3 :(得分:1)

您可以使用Array.prototype.every()并使用第一个对象比较阵列中的所有对象作为比较参考。

function compareArray(array) {
  return array.every(compareObjects.bind(null, array[0]));
}

function compareObjects(x, y) {
   var objectsAreSame = true;
   for(var propertyName in x) {
      if(x[propertyName] !== y[propertyName]) {
         objectsAreSame = false;
         break;
      }
   }
   return objectsAreSame;
}

function compareArray(array) {
  return array.every(compareObjects.bind(null, array[0]));
}

var array1 = [ { a: 1 }, { a: 1 }, { a: 1 }, { a: 1 } ];
var array2 = [ { a: 1 }, { b: 1 }, { c: 1 }, { d: 1 } ];

console.log(compareArray(array1));
console.log(compareArray(array2));

答案 4 :(得分:0)

如果您需要比较对象数组和对象可以包含数组并且每个数组可以包含与对象不同的内容,您可以使用:

const isEqual = (a, b) => {
    if (typeof a === "object" && typeof b === "object") {
        if (Array.isArray(a) && Array.isArray(b)) {
            return a.every((item, index) => isEqual(item, b[index]));
        }
        return Object.entries(a).toString() === Object.entries(b).toString();
    }

    return a === b;
};

对于数组,此函数将递归调用