js对象之间的差异

时间:2016-09-16 07:26:09

标签: javascript arrays performance object prototype

我遇到了以下问题,我正在寻找一种非常有效的方法。

我有两个Javascript对象总是像{id:data,id:data,..}

那样构建

如果我只看键,他们将会是这样的:

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

现在我需要我需要做的信息,将B转换成A,所以在这种情况下:删除B.1和B.4 = A.4。

我在想,也许Object的prototyp函数可能是一个很好的方法。

这是我到目前为止所做的:

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中,并且应该使用需要从B中删除的所有元素调用CallbackB。

我正在努力使用callbackA的元素,一般来说这是否是一种有效的方法。

感谢您的支持!

编辑: 其中一个回调的示例是:

callbackB:

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

1 个答案:

答案 0 :(得分:0)

有几个库可以做到这一点,如果你的搜索NPM,作为一个无耻的插件,我只提一个我创作的差异任何对象,包括数组插入/删除/移动:

https://github.com/benjamine/jsondiffpatch

这里是DEMO页面,根据需要区分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