2016-09-16 11 views
1

Ich habe das folgende Problem und ich bin auf der Suche nach einem wirklich effizienten Weg, dies zu tun.Unterschiede zwischen js Objekte

Ich habe zwei Javascript-Objekte immer bauen wie {id: Daten-ID: Daten, ..}

Wenn ich auf die Tasten schauen nur werden sie wie folgt aussehen:

B = ["1","2","3"] 
A =  ["2","3","4"] 

Now I brauche die Information, was ich tun muss, um B in A zu verwandeln, also in diesem Fall: Löschen B.1 und B.4 = A.4.

Ich dachte, dass eine Prototyp-Funktion für Object eine gute Möglichkeit wäre, dies zu tun.

Dies ist, was ich bisher:

Array.prototype.diff = function(a) { 
      return this.filter(function(i) {return a.indexOf(i) < 0;}); 
     }; 
Object.prototype.syncTo = function(b,callbackA,callbackB){ 
       var a = this; 
       var bKeys = Object.keys(b); 
       var aKeys = Object.keys(a); 

       var toremove = bKeys.diff(aKeys); 
       var toadd = aKeys.diff(bKeys); 

       for(var i = 0; i < toremove.length; i++) { 
         if(b.hasOwnProperty(toremove[i])) { 
          delete b[toremove[i]]; 
         } 
       } 
       callbackB(b); 
       for(var i = 0; i < toadd.length; i++) { 

         if(a.hasOwnProperty(toadd[i])){ 
         <<Dont know how to go on now>>  
         } 
       } 
       callbackA(XXXXXX); 
}; 

Wo CallbackA mit allen Elementen aufgerufen werden soll, die B und CallbackB hinzugefügt werden sollte mit allen Elementen aufgerufen werden, die von B. entfernt werden müssen

Ich kämpfe mit den Elementen für CallbackA und im Allgemeinen, ob dies eine effiziente Möglichkeit ist, dies zu tun.

Vielen Dank für Ihre Unterstützung!

EDIT: Ein Beispiel für eine der Rückrufe wäre:

callbackB:

function (items){ 
     for(var i in items){ 
     items[i].removeSomeWhereElse(); 
     } 
    } 

Antwort

0

Es gibt ein paar Bibliotheken, die diese Option, wenn Sie Ihre Suche NPM, als schamlos Stecker ich tun kann, ‚ll nur eine erwähnen, dass ich verfassten diffs jedes Objekt, einschließlich Array Einfügen/Löschen/bewegt:

https://github.com/benjamine/jsondiffpatch

hier die DEMO Seite diffing 2-Arrays, wie Sie benötigen:

http://benjamine.github.io/jsondiffpatch/demo/index.html?desc=moving%20around&left=%5B0%2C1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%5D&right=%5B10%2C0%2C1%2C7%2C2%2C4%2C5%2C6%2C88%2C9%2C3%5D

Sie Löschungen sehen können, fügt hinzu und sogar bewegt (bewegen Erkennung kann durch Konfiguration deaktiviert werden, wenn Sie wollen)

Mit Bibliothek Je effizienter Sie Ihre Zeit sparen, wenn Sie stattdessen CPU-Zyklen speichern möchten, können Sie einfach eine einfache Implementierung von LCS verwenden (das ist der Standardalgorithmus, um das Problem zu lösen, das Sie beschreiben), siehe: https://en.wikipedia.org/wiki/Longest_common_subsequence_problem

jsondiffpatch umfasst das (für js) und Sie können es von hier stehlen: https://github.com/benjamine/jsondiffpatch/blob/master/src/filters/lcs.js

+0

Ich installierte die Laube Version: var delta = jsondiffpatch.diff (obj1, obj2); Konsole.warnen (Delta); mit var obj1 = { a: 1, b: 2, c: 3, d: } 4; var obj2 = { b: 2, c: 3, d: 4, e: 5 }; Ergebnis ist undefiend :( – Ludi

+0

@Ludi komisch, hier ist ein JSFiddle zeigt den Unterschied der gleichen Werte funktioniert wie erwartet: http://jsfiddle.net/benjamine/tpgfwuk4/3/ – Benja

Verwandte Themen