2017-07-28 47 views
0

比較兩個數組時有沒有辦法獲得更改的值?數組和javascript - 如何比較兩個數組

我會更好地解釋它。

讓我們說我有

arr1 = [1,2,3] 
arr2 = [1,2,3] 

arr2得到動態創建的,默認是一樣的arr1

當我改變arr2arr2 = [0,2,3]我怎麼能檢測到變化的價值? (在這種情況下,1變爲0)?

回答

1

如果你只是想知道哪個值,其中指數變化,什麼變化值,您可以使用Array#reduce創建一組更改。

var arr1 = [1, 2, 3]; 
 
var arr2 = [0, 2, 3]; 
 

 
function whatChanged(arr1, arr2) { 
 
    return arr2.reduce(function(d, v, i) { 
 
    v !== arr1[i] && d.push({ 
 
     index: i, 
 
     from: arr1[i], 
 
     to: v 
 
    }); 
 

 
    return d; 
 
    }, []); 
 
} 
 

 
var diff = whatChanged(arr1, arr2); 
 

 
    console.log(diff);

+0

謝謝,它的工作原理與我需要的完全一樣。再次感謝 – Nick

1

這是你可以用這樣一個簡單的代碼片段:

1)首先纏上ArrayObserver

2)您的數組,那麼只需使用update方法來分配新的數組值

3)跟蹤onUpdated中的新元素回調

4)訪問您的陣列aObserver.array

讓我知道,如果代碼對你有意義的,如果我們需要改變一些東西

var array = [10, 15]; 
 
var aObserver = new ArrayObserver(array); 
 
aObserver.onUpdated(function(newValues, oldArray){ 
 
    console.log('New values are:'); 
 
    console.log(newValues); 
 
}); 
 

 
/* use the update method to assing new value of the array */ 
 
aObserver.update([10, 12]); 
 
aObserver.update([15, 12]); 
 

 
console.log('array values is'); 
 
console.log(aObserver.array); 
 

 

 
/* 
 
    Simple class that is holding the array and when array is updated through 
 
    this class it will give you the new values in a callback of onUpdated method 
 
*/ 
 
function ArrayObserver(array){ 
 
    var that = this; 
 
    var callback = null; 
 
    that.array = array; 
 
    that.update = function(newArray){ 
 
    
 
    var newValues = []; 
 
    /* get a copy of the old array */ 
 
    var oldValues = that.array.slice(); 
 
    
 
    for(var i = 0; i < newArray.length; i++){ 
 
     if(!~that.array.indexOf(newArray[i])){ 
 
     /* this is a new value */ 
 
     newValues.push(newArray[i]); 
 
     } 
 
    } 
 
    
 
    if(callback && {}.toString.call(callback) === '[object Function]'){ 
 
     callback(newValues, oldValues); 
 
    } 
 
     
 
    that.array = newArray; 
 
    } 
 
    
 
    that.onUpdated = function(cb){ 
 
    callback = cb; 
 
    } 
 
}

+0

我試圖將其調整到我的具體情況,感謝現在,我要讓你知道,如果這個工作還是不 – Nick

+0

是請,我可以幫你,如果任何變化需要它。我希望得到的想法:) – codtex

+0

是的,我只需要調整它,因爲我以不同的方式處理更新,使用這個類將不會真的工作,因爲它已經使用promise來處理更新和類似的東西,但我明白了,如果我卡住了,我會告訴你,再次感謝:) – Nick