我想比较 JavaScript 代码中的 2 个对象数组。对象总共有 8 个属性,但每个对象都不会有一个值,并且数组永远不会大于 8 个项目,所以可能是遍历每个对象然后查看值的蛮力方法8 个属性是做我想做的最简单的方法,但在实施之前,我想看看是否有人有更优雅的解决方案。有什么想法吗?
原文由 AdamB 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想比较 JavaScript 代码中的 2 个对象数组。对象总共有 8 个属性,但每个对象都不会有一个值,并且数组永远不会大于 8 个项目,所以可能是遍历每个对象然后查看值的蛮力方法8 个属性是做我想做的最简单的方法,但在实施之前,我想看看是否有人有更优雅的解决方案。有什么想法吗?
原文由 AdamB 发布,翻译遵循 CC BY-SA 4.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 许可协议
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
编辑:您不能在当前、常见的基于浏览器的 JavaScript 解释器实现中重载运算符。
要回答原始问题,您可以采用一种方法,请注意,这有点小技巧,只需 将两个数组序列化为 JSON ,然后比较两个 JSON 字符串。这只会告诉您数组是否不同,显然您也可以对数组中的 每个 对象执行此操作,以查看哪些不同。
另一种选择是使用一个库,它有一些很好的工具来比较对象——我使用并推荐 MochiKit 。
编辑: kamens 给出的答案也 值得考虑,因为比较两个给定对象的单个函数将比任何库要小得多,以执行我的建议(尽管我的建议肯定会足够好)。
这是一个幼稚的实现,可能对您来说已经足够了 - 请注意此实现存在潜在问题:
假设两个对象具有相同的确切属性列表。
哦,很明显,无论好坏,我属于唯一一个返回点阵营。 :)