2016-09-16 50 views
1

我得到了以下問題,我正在尋找一個非常有效的方法來做到這一點。js對象之間的差異

我有兩個JavaScript對象總是建立一個像{ID:數據,ID:數據,..}

如果我只看上的按鍵,他們將是這樣的:

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

現在我需要我需要的信息,將B轉換爲A,因此在這種情況下:刪除B.1和B.4 = A.4。

我在想,也許一個原型函數的對象將是一個很好的方法來做到這一點。

這是我到目前爲止有:

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

凡CallbackA應該有被添加到B和CallbackB與需要從B.刪除所有元素應該叫所有元素被稱爲

我正在努力與callbackA的元素和一般是否這是一個這樣做的有效方式。

感謝您的支持!

編輯: 的回調的一個一個例子是:

callbackB:

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

回答

0

有一對夫婦,如果你的搜索NPM可以做這件事庫,作爲一個無恥的插頭我「會只是提及一個I撰寫該DIFFS的任何對象,包括陣列插入/缺失/移動:

https://github.com/benjamine/jsondiffpatch

這裏的版本比較2個陣列演示頁,因爲你需要:

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

你可以看到刪除,添加,甚至移動

使用庫(移動檢測可以,如果你想配置被禁用)將會更有效地節省您的時間,現在如果您想要節省CPU週期,您可以使用簡單的LCS實現(這是解決您所描述問題的標準算法),請參閱:https://en.wikipedia.org/wiki/Longest_common_subsequence_problem

jsondiffpatch包括(對於js)和你可以從這裏偷取它:https://github.com/benjamine/jsondiffpatch/blob/master/src/filters/lcs.js

+0

我安裝了涼亭版本: var delta = jsondiffpatch.diff(obj1,obj2); 控制檯。警告(增量); 與 VAR OBJ1 = { 一個:1, B:2, C:3, d:4 }; var obj2 = { b:2, c:3, d:4, e:5 }; 結果是undefiend :( – Ludi

+0

@Ludi怪異的,這裏是一個JSFiddle顯示這些相同的值的差異工作如期:http://jsfiddle.net/benjamine/tpgfwuk4/3/ – Benja

相關問題