【问题标题】:How get different in two object in javaScriptjavaScript中的两个对象如何变得不同
【发布时间】:2016-12-02 09:15:00
【问题描述】:

最近我正在做这个项目。我在获取两个 JavaScript 对象之间的差异时遇到了问题。下面是该对象的两个示例。第二个对象有一个额外的键。那么如何获取对象之间的差异。

示例 1

{
  "title": "JavaScript Tutorial",
  "body":  "JavaScript",
  "comments": [ 
    {
      "name":    "John Smith",
      "comment": "Great article",
      "age":     28,
      "stars":   4,
      "date":    "2014-09-01"
    },

  ]
}

示例 2

{
  "title": "JavaScript tutorial",
  "body":  "JavaScript.",
  "topics":"how learn JavaScript withing 10 days",
  "comments": [ 
    {
      "name":    "John Smith",
      "comment": "Great article",
      "age":     28,
      "stars":   4,
      "date":    "2014-09-01"
    },

  ]
}

我想要如下结果。 以下是两个对象的关键不同

"topics":"如何在 10 天内学​​会 JavaScript",

【问题讨论】:

  • 你试过什么?
  • 发布预期结果
  • 比较两个对象时我想要两个对象中的不同键

标签: javascript object deep-diff


【解决方案1】:

如果递归不是一个因素,您可以循环检查两者的属性是否都具有相应的属性。

确保你分别遍历这两个,这样你就不会得到任何误报。

试试这个代码

function sameKeys (obj1, obj2) {
    let diffs = []

    for (let prop in obj1) {
        if (undefined === typeof obj2[prop]
            || obj2[prop] !== obj1[prop]) {

            diffs.push({
                type: (obj2[prop] !== undefined ? "Not equal" : "Undefined"),
                field: prop,
                whichOne: "Object 2",
                values: {
                    object1: obj1[prop],
                    object2: obj2[prop]
                }
            })
        }
    }

    for (let prop in obj2) {
        if (undefined === typeof obj1[prop]
            || obj1[prop] !== obj2[prop]) {

            diffs.push({
                type: (obj1[prop] !== undefined ? "Not equal" : "Undefined"),
                field: prop,
                whichOne: "Object 1",
                values: {
                    object1: obj1[prop],
                    object2: obj2[prop]
                }
            })
        }
    }

    return diffs
}

【讨论】:

  • !obj2[prop] 如果属性存在但具有错误值,则不会给出正确的结果。
  • 如果 obj1[prop] 的值为 undefined,它仍然无法正常工作。最好使用 hasOwnProperty 检查或使用 Object.keys 检查自己的属性。 for..in 还迭代继承的可枚举属性。
  • 我检查了这段代码,但两个对象之间并没有什么不同。如果对象是嵌套的,则返回错误的结果
【解决方案2】:

看看deep-diff,您基本上可以像这样将其用于您的示例数据

var diff = require('deep-diff').diff;

var lhs = {
  "title": "JavaScript Tutorial",
  "body":  "JavaScript",
  "comments": [ 
    {
      "name":    "John Smith",
      "comment": "Great article",
      "age":     28,
      "stars":   4,
      "date":    "2014-09-01"
    },

  ]
};

var rhs = {
  "title": "JavaScript tutorial",
  "body":  "JavaScript.",
  "topics":"how learn JavaScript withing 10 days",
  "comments": [ 
    {
      "name":    "John Smith",
      "comment": "Great article",
      "age":     28,
      "stars":   4,
      "date":    "2014-09-01"
    },

  ]
};

var differences = diff(lhs, rhs);
console.log(differences);

哪个会输出

[ DiffEdit {
    kind: 'E',
    path: [ 'title' ],
    lhs: 'JavaScript Tutorial',
    rhs: 'JavaScript tutorial' },
  DiffEdit {
    kind: 'E',
    path: [ 'body' ],
    lhs: 'JavaScript',
    rhs: 'JavaScript.' },
  DiffNew {
    kind: 'N',
    path: [ 'topics' ],
    rhs: 'how learn JavaScript withing 10 days' } ]

如您所见,除了新属性之外,还有更多变化。 kind 属性也指示了这种差异。如果您只需要新属性,那么只需考虑带有 kind === 'N' 的对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多