2016-07-28 82 views
3

最近我正在开发该项目。我在解决两个JavaScript对象之间的差异时遇到了问题。以下是该对象的两个示例。第二个对象有一个额外的键。那么如何区分这些对象呢?如何在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" 
    }, 

    ] 
} 

欲导致像的下方。 下面是两个对象

“主题”关键的不同:“如何学习JavaScript withing10天”,

+1

你尝试过什么? – nicael

+2

post expected result –

+0

当两个对象比较两个对象时,我想要两个对象中的不同键 –

回答

0

看一看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'

0

对象如果递归不是一个因素,你可以循环两个检查属性,如果两者都拥有相应的属性。

确保你分别循环两次,这样你就不会有任何误报。

试试这个代码出

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 
} 
+0

如果属性存在但是具有错误值,'!obj2 [prop]'不会给出正确的结果。 – RobG

+0

好点查看我的编辑。 – 2016-07-30 00:13:42

+0

如果* obj1 [prop] *的值为undefined *,它将无法正常工作。最好使用* hasOwnProperty *检查或使用* Object.keys *来检查自己的属性。 * for..in *也遍历继承的可枚举属性。 – RobG

相关问题