2014-06-20 66 views
1

有沒有一種方法可以根據元素位置的變化來比較數組之間的差異?下劃線 - 比較兩個對象陣列(位置)

我有對象的原始陣列進行它的元素的其中一個值發生變化,這種變化被映射到一個新的數組:

origElements = [{id: 1, value: 50}, 
        {id: 2, value: 60}, 
        {id: 3, value: 70}] 

changedElements = [{id: 1, value: 50}, 
        {id: 3, value: 60}, 
        {id: 2, value: 120}] 


var diff = _.difference(_.pluck(origElements, "id"), _.pluck(changedElements, "id")); 
var result = _.filter(origElements, function(obj) { return diff.indexOf(obj.id) >= 0; }); 

在這種情況下,它是很清楚,爲什麼「結果」將返回沒有。由於[1,2,3]和[1,3,2]之間的值沒有區別。我試圖在這裏實現的是一種'嚴格的差異',它也會查看索引,從而返回對象的新順序的一些引用。

+1

如果你加入拔毛的結果呢?這樣你會有一個獨特的字符串。 – amenadiel

+0

你真的關心一個id的索引變化嗎?這似乎無關緊要。或者你關心價值的變化? – Jon

+0

我關心索引的更改,因爲我在DOM上使用動畫來模擬更改位置的元素。當這個動畫結束時,我只是讓一個handlebars幫助器在DOM上呈現排序後的元素。 @amandiel可能會工作,我會嘗試它 – Mazka

回答

2

如何做這種方式:

var origElements = [{ 
    id: 1, 
    value: 50 
}, { 
    id: 2, 
    value: 60 
}, { 
    id: 3, 
    value: 70 
}]; 

var changedElements = [{ 
    id: 1, 
    value: 50 
}, { 
    id: 3, 
    value: 60 
}, { 
    id: 2, 
    value: 120 
}]; 

var origElementsIds = _.pluck(origElements, "id"); 
var changedElementsIds = _.pluck(changedElements, "id"); 
console.log("Are array element positions same ?", 
    origElementsIds.join() === changedElementsIds.join());