2016-09-16 110 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