【问题标题】:comparing two array and finding the difference [duplicate]比较两个数组并找到差异[重复]
【发布时间】:2016-03-13 06:49:22
【问题描述】:

我有两个数组,

var original = [10,80,30,100,160];
var edited = [80,120,140,70,160,30];

从上面,

我需要比较并获取哪些所有元素都存在于“已编辑”数组中但不存在于“原始”数组中。

还有,

需要获取“原始”中存在但“已编辑”中不存在的元素。

所以输出应该如下,

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 循环,即添加和删除。

有没有更好的逻辑来做到这一点?

请给我建议。

【问题讨论】:

  • 我真的不认为这个问题是重复的。他不是在问如何进行差异化,而是在问代码。他在问如何更有效地进行两个差异。

标签: javascript arrays data-structures logic


【解决方案1】:

你可以像这样定义一个函数..

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了解更多详情..

【讨论】:

【解决方案2】:

有一些图书馆可以做到这一点。我不知道他们使用什么逻辑,但我可以看到更好的逻辑

与其运行四个 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,因此某些函数(如 splice)并不像看起来那么糟糕。

【讨论】:

    【解决方案3】:

    您可以使用以下代码轻松做到这一点-

    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]
    

    希望这会有所帮助!

    【讨论】:

    • indexOf 相当于循环数组查找元素。这实际上是他在代码中所做的。
    【解决方案4】:

    如果你使用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

    【讨论】:

      【解决方案5】:

      如果我能很好地理解您的问题,underscore.js 会为您提供一个简单的解决方案:

      http://underscorejs.org/#without

      这个函数。基本上将 arr1 与 arr2 进行比较,返回所有 array2 与 arr1 的不同之处。如果您需要全部差异,您可以使用 func 2 次:

      比较 arr1 和 arr2 并存储它 比较 arr2 和 arr1 并存储它

      合并结果

      【讨论】:

        【解决方案6】:

        试试这个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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多