比较两个数组并找出差异
comparing two array and finding the difference
我有两个数组,
var original = [10,80,30,100,160];
var edited = [80,120,140,70,160,30];
从上面,
我需要比较并获取数组 "edited" 中存在但不存在于 "original" 中的所有元素。
此外,
需要获取 "original" 中存在但 "edited" 中不存在的元素。
所以输出应该是这样的,
Added Elements 120,140,70
Deleted Elements 10,100
我写的代码如下,
var fn100 = function(){
var original = [10,80,30,100,160];
var edited = [80,120,140,70,160,30];
var newlyAdded = [];
var dropped = [];
var isFound = false;
var x = 0, y = 0;
//for added
for(x = 0; x < edited.length; x++){
isFound = false;
for(y = 0; y < original.length; y++){
if(edited[x] === original[y]){
isFound = true;
break;
}
}
if(isFound === false){
newlyAdded.push(edited[x]);
}
}//for added
//for dropped
for(x = 0; x < original.length; x++){
isFound = false;
for(y = 0; y < edited.length; y++){
if(original[x] === edited[y]){
isFound = true;
break;
}
}
if(isFound === false){
dropped.push(original[x]);
}
}// for dropped
print("Added Elements "+newlyAdded);
print("Deleted Elements "+dropped);
}
fn100();
从上面的代码可以看出我写了两个 for 循环,即 for added 和 for dropped。
这样做有什么更好的逻辑吗?
请推荐我。
您可以使用以下代码轻松完成此操作-
var edited = [80,120,140,70,160,30];
var original = [10,80,30,100,160];
var added = $.grep(edited, function(el) { return $.inArray(el, original) == -1; }); // returns added= [120,140,70]
var deleted = $.grep(original, function(el) { return $.inArray(el, edited) == -1; }); //returns deleted = [10,100]
另一种使用 filter() 函数的方法
deleted = original.filter( function( el ) {
return edited.indexOf( el ) < 0;
}); //returns [10,100]
added = edited.filter( function(el) {
return original.indexOf(el) < 0;
}); //returns[120,140,70]
希望对您有所帮助!
你可以这样定义一个函数..
Array.prototype.diff = function(a) {
return this.filter(function(i) {return a.indexOf(i) < 0;});
};
然后只需检索添加和删除的元素,您可以执行以下操作:
var added = edited.diff(original);
//added = [120,140,70]
var deleted = original.diff(edited);
//deleted = [10,100];
查看此 link 了解更多详情..
试试这个 jquery 函数
var original = [10, 80, 30, 100, 160];
var edited = [80, 120, 140, 70, 160, 30];
var addedElements = $(edited).not(original).get();
var droppedElements = $(original).not(edited).get();
如果你使用underscore.js
它是一个班轮。
var original = [10,80,30,100,160];
var edited = [80,120,140,70,160,30];
var dif = _.difference(original, edited);
var dif1 = _.difference( edited, original);
console.log(dif)
console.log(dif1)
工作代码here
如果我理解你的问题,underscore.js 有一个简单的解决方案:
http://underscorejs.org/#without
这个功能。基本上比较 arr1 和 arr2,返回所有 array2 与 arr1 的不同之处。如果你需要整个差异,你可以使用 func 2次:
比较arr1和arr2并存储
将 arr2 与 arr1 进行比较并存储它
合并结果
有些图书馆可以做到这一点。我不知道他们使用什么逻辑,但我可以看到 更好的逻辑。
而不是 运行 四个 for 循环 (2x2),运行 两个:
(下面是未编译、未测试的半 sudo 代码)
var orig = [1, 2, 3]
var changed = [1, 2, 4]
var checklist = changed.slice(0);
var removed = [];
var similar = [];
//go through original
for(i_or in orig) {
var target = orig[i_or];
var found = false;
//check for item in checklist
for(i_ch in checklist) {
//if it exists, remove it from checklist. It's similar
//different from indexOf because it removes all duplicates
if(checklist[i_ch] == target) {
checklist = checklist.splice(i_ch, 1)
i_ch--; //don't forget about it!
similar.push(target) //if you want similar
found = true;
}
}
//if not found, it's been removed
if(found == false)
removed.push(target)
}
console.log("deleted ", removed);
console.log("new ", checklist); //anything left in checklist is new
console.log("same ", similar);
这可能不是最好的方法,但逻辑更好。
此外,javascript 数组是 often linked lists,因此某些函数(如拼接)并不像它们看起来那么糟糕。
我有两个数组,
var original = [10,80,30,100,160];
var edited = [80,120,140,70,160,30];
从上面,
我需要比较并获取数组 "edited" 中存在但不存在于 "original" 中的所有元素。
此外,
需要获取 "original" 中存在但 "edited" 中不存在的元素。
所以输出应该是这样的,
Added Elements 120,140,70
Deleted Elements 10,100
我写的代码如下,
var fn100 = function(){
var original = [10,80,30,100,160];
var edited = [80,120,140,70,160,30];
var newlyAdded = [];
var dropped = [];
var isFound = false;
var x = 0, y = 0;
//for added
for(x = 0; x < edited.length; x++){
isFound = false;
for(y = 0; y < original.length; y++){
if(edited[x] === original[y]){
isFound = true;
break;
}
}
if(isFound === false){
newlyAdded.push(edited[x]);
}
}//for added
//for dropped
for(x = 0; x < original.length; x++){
isFound = false;
for(y = 0; y < edited.length; y++){
if(original[x] === edited[y]){
isFound = true;
break;
}
}
if(isFound === false){
dropped.push(original[x]);
}
}// for dropped
print("Added Elements "+newlyAdded);
print("Deleted Elements "+dropped);
}
fn100();
从上面的代码可以看出我写了两个 for 循环,即 for added 和 for dropped。
这样做有什么更好的逻辑吗?
请推荐我。
您可以使用以下代码轻松完成此操作-
var edited = [80,120,140,70,160,30];
var original = [10,80,30,100,160];
var added = $.grep(edited, function(el) { return $.inArray(el, original) == -1; }); // returns added= [120,140,70]
var deleted = $.grep(original, function(el) { return $.inArray(el, edited) == -1; }); //returns deleted = [10,100]
另一种使用 filter() 函数的方法
deleted = original.filter( function( el ) {
return edited.indexOf( el ) < 0;
}); //returns [10,100]
added = edited.filter( function(el) {
return original.indexOf(el) < 0;
}); //returns[120,140,70]
希望对您有所帮助!
你可以这样定义一个函数..
Array.prototype.diff = function(a) {
return this.filter(function(i) {return a.indexOf(i) < 0;});
};
然后只需检索添加和删除的元素,您可以执行以下操作:
var added = edited.diff(original);
//added = [120,140,70]
var deleted = original.diff(edited);
//deleted = [10,100];
查看此 link 了解更多详情..
试试这个 jquery 函数
var original = [10, 80, 30, 100, 160];
var edited = [80, 120, 140, 70, 160, 30];
var addedElements = $(edited).not(original).get();
var droppedElements = $(original).not(edited).get();
如果你使用underscore.js
它是一个班轮。
var original = [10,80,30,100,160];
var edited = [80,120,140,70,160,30];
var dif = _.difference(original, edited);
var dif1 = _.difference( edited, original);
console.log(dif)
console.log(dif1)
工作代码here
如果我理解你的问题,underscore.js 有一个简单的解决方案:
http://underscorejs.org/#without
这个功能。基本上比较 arr1 和 arr2,返回所有 array2 与 arr1 的不同之处。如果你需要整个差异,你可以使用 func 2次:
比较arr1和arr2并存储 将 arr2 与 arr1 进行比较并存储它
合并结果
有些图书馆可以做到这一点。我不知道他们使用什么逻辑,但我可以看到 更好的逻辑。
而不是 运行 四个 for 循环 (2x2),运行 两个: (下面是未编译、未测试的半 sudo 代码)
var orig = [1, 2, 3]
var changed = [1, 2, 4]
var checklist = changed.slice(0);
var removed = [];
var similar = [];
//go through original
for(i_or in orig) {
var target = orig[i_or];
var found = false;
//check for item in checklist
for(i_ch in checklist) {
//if it exists, remove it from checklist. It's similar
//different from indexOf because it removes all duplicates
if(checklist[i_ch] == target) {
checklist = checklist.splice(i_ch, 1)
i_ch--; //don't forget about it!
similar.push(target) //if you want similar
found = true;
}
}
//if not found, it's been removed
if(found == false)
removed.push(target)
}
console.log("deleted ", removed);
console.log("new ", checklist); //anything left in checklist is new
console.log("same ", similar);
这可能不是最好的方法,但逻辑更好。
此外,javascript 数组是 often linked lists,因此某些函数(如拼接)并不像它们看起来那么糟糕。