判断两个对象集合是否相等?

有两个独立的对象集合,如何判断这两个集合里面的对象个数、属性、值是否相等?越简单越好的。

阅读 17.9k
5 个回答
obj=[{id:1,name:'a'},{id:2,name:'b'}]
obj2=[{id:1,name:'a'},{id:2,name:'b'}]
obj3=[{id:1,name:'a'},{id:3,name:'c'}]
obj==obj2;//false
JSON.stringify(obj)==JSON.stringify(obj2);//true
JSON.stringify(obj)==JSON.stringify(obj3);//false

这个答案保证能让你满足

function compare(obj1,obj2){
    if(Object.keys(obj1).length != Object.keys(obj2).length){
      return false
    }else{
      for(key in obj1){
        if(obj2.hasOwnProperty(key)){
            if( !Object.is(obj1[key],obj2[key])){
                return false;
            }
        }else{
          return false
        }
      }
      return true
    }
}

js这样的动态类型语言,相等这个词的涵义实际上非常丰富。
你问如何判断对象相等,那么首先需要做的就是定义一下你这个相等需要达到什么程度。

  1. 引用地址相等

  2. 原型链是否需要一致?

  3. 构造函数是否需要一致?

  4. 如果要检查内容,自身属性之下的对象是判断其引用相等还是递归调用当前相等函数进行判断?

  5. 循环引用怎么办?

…………等等
它们各自的处理方式都有些微妙的区别。

使用underscoreisEqual就好啦:

a = [ { name: 'wang' }, { name: 'liu' } ]
b = [ { name: 'wang' }, { name: 'liu' } ]
_.isEqual(a, b) // true
var a = new Set([1,2,3]);
var b = new Set([1,3,2]);

console.log(eqSet(a, b)); // true

function eqSet(as, bs) {
    if (as.size !== bs.size) return false;
    for (var a of as) if (!bs.has(a)) return false;
    return true;
}

参见:https://stackoverflow.com/que...

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