2016-07-28 13 views
3

anders kommen Kürzlich arbeite ich an dem Projekt. Ich stehe vor dem Problem, den Unterschied zwischen zwei JavaScript-Objekten zu erkennen. Im Folgenden sind zwei Beispiele für das Objekt. Das zweite Objekt hat einen zusätzlichen Schlüssel. So, wie man den Unterschied zwischen den Gegenständen erhält.Wie in zwei Objekte in javaScript

Beispiel 1

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

    ] 
} 

Beispiel 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" 
    }, 

    ] 
} 

I wie unten führen wollen. Unten finden Schlüssel unterscheidet sich in zwei Objekt

„Themen“: „Wie JavaScript 10 Tage withing lernen“,

+1

Was Sie versucht haben? – nicael

+2

post erwartetes Ergebnis –

+0

Ich möchte einen anderen Schlüssel in zwei Objekten, wenn zwei Objekte verglichen werden –

Antwort

0

Werfen Sie einen Blick auf deep-diff, die Sie im Wesentlichen, wie dies für Ihre Beispieldaten verwenden können

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); 

die folgende Ausgabe

[ 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' } ] 

Wie Sie sehen können, gibt es mehr Veränderungen als nur die neue Eigenschaft. Die Art des Unterschieds wird auch durch die Eigenschaft kind angezeigt. Wenn Sie nur die neue Eigenschaft benötigen, betrachten Sie die Objekte nur mit kind === 'N'

0

Wenn Rekursion kein Faktor ist, können Sie die Eigenschaften beider Prüfungen einfach durchlaufen, wenn beide die entsprechende Eigenschaft besitzen.

Stellen Sie sicher, dass Sie beide überlappen, so dass Sie keine falschen positiven Ergebnisse erhalten.

diesen Code ausprobieren

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]' gibt keine korrekten Ergebnisse, wenn die Eigenschaft existiert, aber einen falschen Wert hat. – RobG

+0

Guter Punkt check out meine Bearbeitung. –

+0

Es funktioniert immer noch nicht korrekt, wenn * obj1 [prop] * den Wert * undefined * hat. Besser, ein * hasOwnProperty * zu verwenden oder * Object.keys * zu verwenden, um eigene Eigenschaften zu überprüfen. * for..in * iteriert auch über vererbte aufzählbare Eigenschaften. – RobG

Verwandte Themen