2016-03-13 65 views
0

我有兩個陣列,比較兩個陣列,並找到差值

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(); 

從上面的代碼,即對添加和丟棄。

有沒有更好的邏輯來做到這一點?

請給我建議。

+0

我真的不認爲這個問題是重複的。他並沒有問如何做差異,代碼是在問題中。他在問如何更有效地做兩種差異。 –

回答

0

有一些做的圖書館這個。我不知道他們用什麼邏輯,但有更好的邏輯可用,我可以看到。

而不是運行4個for循環(2×2),運行兩個: (未編譯,未經測試,半須藤下面的代碼)

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,所以某些功能(如剪接)並不像可怕,因爲它們可能看起來。

0

您可以輕鬆地通過使用下面的代碼 -

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] 

另一種方法使用的過濾器()函數

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] 

希望這有助於做到這一點!

+0

indexOf等價於循環數組以查找元素。這實際上是他在代碼中做的。 –

2

您可以定義一個funtion這樣的..

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瞭解更多詳情..

+0

對於那些想知道過濾器是如何工作的:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray% 2Ffilter –

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(); 
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

0

如果我明白你的問題很好,underscore.js有你一個簡單的解決方案:

http://underscorejs.org/#without

本功能。基本上比較arr1與arr2比較,返回所有array2與arr1不同。如果您需要整個區別,你可以使用FUNC 2次:

比較ARR1到ARR2,並將其存儲 比較ARR2到ARR1,並將其存儲

合併結果