比较两个对象并确定具有不同属性的父节点

时间:2018-08-17 09:31:22

标签: javascript reactjs

我有一个场景,需要比较treeObject1和treeObject2以确定属性级别的确切差异并找到修改后节点的父级。

在下面提供的对象中,我需要将输出显示为蓝色。因为差异在于otherObj2。

treeObject1  = {
color: "red", 
value: 10, 
otherObj: { 
   color: "blue", 
   otherObj2: { 
     otherColor: "blue", 
     otherValue: 20,
    }
}
}

treeObject2  = {
color: "red", 
value: 10, 
otherObj: { 
   color: "blue", 
   otherObj2: { 
     otherColor: "Green", 
     otherValue: 20,
    }
}
}

2 个答案:

答案 0 :(得分:1)

如果您也想要键“ otherObj”,请告诉我,可以轻松添加。否则,这是您正在寻找的工作版本。

这结合使用Object.keysevery

treeObject1 = {
  color: "red",
  value: 10,
  otherObj: {
    color: "blue",
    otherObj2: {
      otherColor: "blue",
      otherValue: 20,
    }
  }
}

treeObject2 = {
  color: "red",
  value: 10,
  otherObj: {
    color: "blue",
    otherObj2: {
      otherColor: "Green",
      otherValue: 20,
    }
  }
}

const findParentNode = (obj1, obj2, parent = null) => {
   
   if(parent === null) parent = obj2;

   //since the structures are the same we only get keys from the first object
   const keys = Object.keys(obj1);
   
   let result = null;
   //iterate through every key
   keys.every(key=>{
     //if it's an object... then we recall findParentNode (recursive)
     if(obj1[key] instanceof Object){
        result = findParentNode(obj1[key], obj2[key], obj2);
        //If result from findParentNode is not null then a difference was found. 
        //Return false to stop the every method.
        if(result !== null) return false;
        
     }else if(obj1[key] !== obj2[key]){
        //If the objects are different we found a difference
        //Set the parent as the difference
        result = parent;
        return false;
     }
     //return true to keep on looping
     return true;
  });
  //return the result
  return result;
}

console.log(findParentNode(treeObject1, treeObject2));

**请注意,如果未找到任何内容,以上代码段将返回“ null”。 **

答案 1 :(得分:1)

您可以对对象使用嵌套方法并检查值。

function getDiffParents(object1, object2, parent = {}) {
    return Object.assign(...Object.entries(object1).map(([k, v]) => v && typeof v === 'object'
        ? getDiffParents(v, object2[k], object1)
        : v === object2[k]
            ? {}
            : parent
    ));
}

var treeObject1 = { color: "red", value: 10, otherObj: { color: "blue", otherObj2: { otherColor: "blue", otherValue: 20 } } },
    treeObject2 = { color: "red", value: 10, otherObj: { color: "blue", otherObj2: { otherColor: "Green", otherValue: 20 } } };

console.log(getDiffParents(treeObject1, treeObject2));
.as-console-wrapper { max-height: 100% !important; top: 0; }