首页 > 解决方案 > 比较 JavaScript 中的嵌套对象并返回键相等

问题描述

我有两个嵌套对象obj1obj2我想比较它们并递归返回一个对象,该对象对于每个嵌套键都有一个类似相等的布尔标志

所以对于给定的obj1喜欢

obj1 = {
  prop1: 1,
  prop2: "foo",
  prop3: {
    prop4: 2,
    prop5: "bar" 
  }
}

obj2类的

obj2 = {
      prop1: 3,
      prop2: "foo",
      prop3: {
        prop4: 2,
        prop5: "foobar" 
      },
      prop6: "new"
    }

它应该返回

equality = {
     prop1: false,
     prop2: true,
     prop3 : {
       prop4: true,
       prop5: false
     },
     prop6: false
   }

如果一个对象有一个新的属性,比如obj2.prop6,那么相等性就是equality.prop6 = false

对于非嵌套对象,这里有一个简单的键比较解决方案在 javascript 中获取两个对象之间差异的属性 而递归比较嵌套对象,这里显示JavaScript:递归深度比较:对象和属性

标签: javascript

解决方案


如果两个值都是对象,您可以迭代所有键并检查嵌套对象。

const isObject = v => v && typeof v === 'object';

function getDifference(a, b) {
    return Object.assign(...Array.from(
        new Set([...Object.keys(a), ...Object.keys(b)]),
        k => ({ [k]: isObject(a[k]) && isObject(b[k])
            ? getDifference(a[k], b[k])
            : a[k] === b[k]
        })
    ));
}

var obj1 = { prop1: 1, prop2: "foo", prop3: { prop4: 2, prop5: "bar" } },
    obj2 = { prop1: 3, prop2: "foo", prop3: { prop4: 2, prop5: "foobar" }, prop6: "new" };

console.log(getDifference(obj1, obj2));


推荐阅读