比较 JavaScript 中的对象数组

新手上路,请多包涵

我想比较 JavaScript 代码中的 2 个对象数组。对象总共有 8 个属性,但每个对象都不会有一个值,并且数组永远不会大于 8 个项目,所以可能是遍历每个对象然后查看值的蛮力方法8 个属性是做我想做的最简单的方法,但在实施之前,我想看看是否有人有更优雅的解决方案。有什么想法吗?

原文由 AdamB 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 622
2 个回答

编辑:您不能在当前、常见的基于浏览器的 JavaScript 解释器实现中重载运算符。

要回答原始问题,您可以采用一种方法,请注意,这有点小技巧,只需 将两个数组序列化为 JSON ,然后比较两个 JSON 字符串。这只会告诉您数组是否不同,显然您也可以对数组中的 每个 对象执行此操作,以查看哪些不同。

另一种选择是使用一个库,它有一些很好的工具来比较对象——我使用并推荐 MochiKit


编辑: kamens 给出的答案也 值得考虑,因为比较两个给定对象的单个函数将比任何库要小得多,以执行我的建议(尽管我的建议肯定会足够好)。

这是一个幼稚的实现,可能对您来说已经足够了 - 请注意此实现存在潜在问题:

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

假设两个对象具有相同的确切属性列表。

哦,很明显,无论好坏,我属于唯一一个返回点阵营。 :)

原文由 Jason Bunting 发布,翻译遵循 CC BY-SA 3.0 许可协议

由于序列化通常不起作用(仅当属性顺序匹配时: JSON.stringify({a:1,b:2}) !== JSON.stringify({b:2,a:1}) ),您必须检查属性的数量并比较每个属性:

 const objectsEqual = (o1, o2) =>
    Object.keys(o1).length === Object.keys(o2).length
        && Object.keys(o1).every(p => o1[p] === o2[p]);

const obj1 = { name: 'John', age: 33};
const obj2 = { age: 33, name: 'John' };
const obj3 = { name: 'John', age: 45 };

console.log(objectsEqual(obj1, obj2)); // true
console.log(objectsEqual(obj1, obj3)); // false

如果需要深度比较,可以递归调用函数:

 const obj1 = { name: 'John', age: 33, info: { married: true, hobbies: ['sport', 'art'] } };
const obj2 = { age: 33, name: 'John', info: { hobbies: ['sport', 'art'], married: true } };
const obj3 = { name: 'John', age: 33 };

const objectsEqual = (o1, o2) =>
    typeof o1 === 'object' && Object.keys(o1).length > 0
        ? Object.keys(o1).length === Object.keys(o2).length
            && Object.keys(o1).every(p => objectsEqual(o1[p], o2[p]))
        : o1 === o2;

console.log(objectsEqual(obj1, obj2)); // true
console.log(objectsEqual(obj1, obj3)); // false

然后很容易使用这个函数来比较数组中的对象:

 const arr1 = [obj1, obj1];
const arr2 = [obj1, obj2];
const arr3 = [obj1, obj3];

const arraysEqual = (a1, a2) =>
   a1.length === a2.length && a1.every((o, idx) => objectsEqual(o, a2[idx]));

console.log(arraysEqual(arr1, arr2)); // true
console.log(arraysEqual(arr1, arr3)); // false

原文由 ttulka 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题