我遇到了以下问题,我正在寻找一种非常有效的方法。
我有两个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();
}
}
答案 0 :(得分:0)
有几个库可以做到这一点,如果你的搜索NPM,作为一个无耻的插件,我只提一个我创作的差异任何对象,包括数组插入/删除/移动:
https://github.com/benjamine/jsondiffpatch
这里是DEMO页面,根据需要区分2个数组:
您可以看到删除,添加甚至移动(如果需要,可以通过配置禁用移动检测)
使用库将更有效地节省您的时间,现在如果您想节省CPU周期,您可以使用LCS的简单实现(这是解决您问题的标准算法)描述),见:https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
jsondiffpatch包括(对于js),你可以从这里偷取它:https://github.com/benjamine/jsondiffpatch/blob/master/src/filters/lcs.js