【问题标题】:Comparing Objects and Pulling Out Deep Diff比较对象并提取深度差异
【发布时间】:2019-02-06 14:02:54
【问题描述】:

在我的 Node/MongoDB 后端中,我正在做一些后处理,以便在记录发生更改时生成注释。所以第一步是得到一个prepost更新版本的记录。然后我想比较两者以识别记录中发生变化的部分。我在下面的解决方案有效 - 但它返回包含更改的根级别属性。我需要比这更精细的东西——因为我有一个数组——“历史”,嵌入在根级元素中,还有一个数组——“服务”。

因此,以我下面的两个对象为例,有没有一种方法可以提取 obj2 的“历史”数组中的最后一个元素——因为在这种情况下,这就是改变的地方,这就是我需要输入才能生成我的笔记吗?

顺便说一句,如果有 Underscore 或 Lodash 方式来处理这个问题,我也完全愿意接受。

这是我现在拥有的代码:

const obj = {
  _id: 1,
  services: [
    {
      _id: 23,
      service: "serviceOne",
      history: [
        {
          _id: 33,
          stage: "stageOne"
        }
      ]
    },
        {
      _id: 24,
      service: "serviceTwo",
      history: [
        {
          _id: 44,
          stage: "stageOne"
        }
      ]
    },
  ]
};

const obj2 = {
  _id: 1,
  services: [
    {
      _id: 23,
      service: "serviceOne",
      history: [
        {
          _id: 33,
          stage: "stageOne"
        }
      ]
    },
        {
      _id: 24,
      service: "serviceTwo",
      history: [
        {
          _id: 45,
          stage: "stageTwo"
        },
        {
          _id: 44,
          stage: "stageOne"
        }
      ]
    },
  ]
};

let diff = Object.keys(obj).reduce((diff, key) => {
  if (obj[key] === obj2[key]) return diff
  return {
    ...diff,
    [key]: obj2[key]
  }
}, {})

console.log('diff: ', diff);

【问题讨论】:

标签: javascript arrays recursion


【解决方案1】:

你可以使用解构赋值

let {services:[,{history:[...data]}]} = obj2;

console.log(data.pop());

【讨论】:

  • @Muirik 分配给history 属性的数组。如果最多只有 2 个元素,您可以使用 let {services:[,{history:[, data]}]} = obj2;
  • 好的,知道了,谢谢!在我的情况下,“历史”数组中可能有很多元素,所以我会坚持你发布的例子。
猜你喜欢
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多