比较两个数组并找出差异

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,因此某些函数(如拼接)并不像它们看起来那么糟糕。