JavaScript中的深度对象比较和属性定位

时间:2019-02-08 21:19:24

标签: javascript arrays object

我正在尝试找出是否有任何es6(或外部库)方法来处理JavaScript中的深层对象比较和解析。

以下面的示例为例,其中我有一个属性history,它是一个数组,嵌入在属性services中,该属性也是一个数组:

 {
   _id: 4d39fe8b23dac43194a7f571,
   name: {
     first: "Jane",
     last: "Smith"
   }
   services: [
    {
     service: "typeOne",
     history: [ 
       { _id: 121, 
         completed: true,
         title: "rookie"
       },
       { _id: 122, 
         completed: false,
         title: "novice"
       } 
      ]
     },
     {
      service: "typeTwo",
      history: [ 
       { _id: 135, 
         completed: true,
         title: "rookie"
       },
       { _id: 136, 
         completed: false,
         title: "novice"
       } 
      ]
     }
   ]
 }

现在,说一个新元素被推到第二个“服务”元素内的“历史”数组上,其中(服务:“ typeTwo”)-在“服务”数组上。我需要确定发生了这种情况,并拉出整个父元素,因为我还需要知道“服务”数组中的哪些“服务”添加了新的“历史”元素。

有没有一种方法可以扫描整个对象,不仅可以确定何时进行了更改,而且还可以提取我需要参考的部分?我可以在此处使用本机JS或JS库选项。

2 个答案:

答案 0 :(得分:0)

您可以像这样检查重复项:

function isEqual(firstObject, secondObject) {
  function _equals(firstObject, secondObject) {
    let clone = {...{}, ...firstObject}, cloneStr = JSON.stringify(clone);
    return cloneStr === JSON.stringify({...clone, ...secondObject});
  }
  return _equals(firstObject, secondObject) && _equals(secondObject, firstObject);
}

https://jsfiddle.net/b1puL04w/

答案 1 :(得分:0)

如果您考虑使用库声明的话,那么lodash具有_.isEqual的确会在两个值之间进行深度比较以确定它们是否相等。

过去,我广泛使用它进行深度比较。