首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较JavaScript中的对象数组

比较JavaScript中的对象数组
EN

Stack Overflow用户
提问于 2008-08-26 06:15:22
回答 16查看 264.5K关注 0票数 92

我想在JavaScript代码中比较两个对象数组。这些对象总共有8个属性,但是每个对象都没有一个值,并且每个数组永远不会超过8个项目,所以也许遍历每个对象然后查看8个属性的值的暴力方法是完成我想要做的事情的最简单的方法,但在实现之前,我想看看是否有人有更好的解决方案。有什么想法吗?

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2008-08-26 01:39:34

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

要回答最初的问题,有一种方法可以做到这一点,请注意,这是一个小技巧,简单地serialize the two arrays to JSON,然后比较两个JSON字符串。这将简单地告诉您,如果数组不同,显然您也可以对数组中的每个对象执行此操作,以查看哪些对象是不同的。

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

编辑: The answer kamens gave也值得考虑,因为用于比较两个给定对象的单个函数将比我建议的任何库都要小得多(尽管我的建议肯定可以很好地工作)。

这里有一个天真的实现,可能对你来说已经足够了--要知道这个实现有潜在的问题:

代码语言:javascript
复制
function objectsAreSame(x, y) {
   var objectsAreSame = true;
   for(var propertyName in x) {
      if(x[propertyName] !== y[propertyName]) {
         objectsAreSame = false;
         break;
      }
   }
   return objectsAreSame;
}

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

哦,可能很明显,不管是好是坏,我属于唯一的一个返回点阵营。:)

票数 64
EN

Stack Overflow用户

发布于 2019-03-20 16:22:47

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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
票数 59
EN

Stack Overflow用户

发布于 2008-08-26 12:52:12

老实说,最多有8个对象,每个对象最多有8个属性,你最好的选择就是遍历每个对象并直接进行比较。它会很快,也会很容易。

如果你打算经常使用这些类型的比较,那么我同意Jason关于JSON serialization...but的观点,否则就没有必要使用新的库或JSON序列化代码来减慢你的应用程序的速度。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档