比较两个阵列并找出差异

时间:2016-03-13 06:49:23

标签: javascript arrays data-structures logic

我有两个数组,

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

有没有更好的逻辑呢?

请建议我。

6 个答案:

答案 0 :(得分:2)

您可以定义这样的功能..

@Override
protected void onResume()
{
   hsv.post(new Runnable()
   {
     @Override
      public void run()
       {
       hsv.scrollTo(scrollX, scrollY);
        }
     });
  }

然后只需检索添加和删除的元素即可:

Array.prototype.diff = function(a) {
    return this.filter(function(i) {return a.indexOf(i) < 0;});
};

查看此link了解更多详情..

答案 1 :(得分:0)

您可以使用以下代码轻松完成此操作 -

 <p>Total: PHP <span id="price">0</span></p>

另一种使用filter()函数的替代方法

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]

希望这有帮助!

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果我理解你的问题,那么underscore.js会为你提供一个简单的解决方案:

http://underscorejs.org/#without

这个功能。基本上将arr1与arr2进行比较,返回所有与arr1不同的array2。如果你需要完全不同,你可以使用func 2次:

将arr1与arr2进行比较并存储它 将arr2与arr1进行比较并存储

合并结果

答案 5 :(得分:0)

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

不是运行四个for循环(2x2),而是运行两个: (下面未编译,未经测试,半sudo代码)

resolve

这可能不是最好的方法,但它是更好的逻辑

此外,javascript数组是often linked lists,因此某些功能(如拼接)并不像它们看起来那么糟糕。