2016-11-09 91 views
0

如何比較兩個對象數組並在兩個數組中存在對象時更新一個鍵?與對象數組和角度更新鍵比較

$scope.listOne = [ 
    {id: 1, selected: false}, 
    {id: 2, selected: false}, 
    {id: 3, selected: false} 
]; 

$scope.listTwo = [ 
    {id: 4, color: orange}, 
    {id: 5, color: blue}, 
    {id: 2, color: green} 
]; 

使用上述對象,我如何比較它們並將listOne [1] .selected更新爲true?

+0

所以你要比較那麼listOne和listtwo完成,如ID :2都存在於它們中,輸出應該是listone [2] .selected = true? – Geeky

+0

請讓我們知道什麼對你有用 – Geeky

+0

@geeky我不是在尋找新的輸出,只是爲了更新listOne的選定屬性,如果listTwo中存在相同的ID – Flignats

回答

1

在這裏,我想循環通過listone並檢查是否有這樣的密鑰在listtwo如果這樣做那麼listOne的selected屬性爲true

這在vanila的JavaScript

var listOne = [{ 
 
    id: 1, 
 
    selected: false 
 
}, { 
 
    id: 2, 
 
    selected: false 
 
}, { 
 
    id: 3, 
 
    selected: false 
 
}]; 
 

 
var listTwo = [{ 
 
    id: 4, 
 
    color: "orange" 
 
}, { 
 
    id: 5, 
 
    color: "blue" 
 
}, { 
 
    id: 2, 
 
    color: "green" 
 
}]; 
 

 

 

 
angular.forEach(listOne, function(value) { 
 
    for (var key in listTwo) { 
 
    if (listTwo[key]["id"] == value.id) { 
 
     value.selected = true; 
 
    } 
 
    } 
 
}); 
 
console.log(listOne);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

希望這有助於

+0

好的解決方案,我怎麼能用angular.forEach? – Flignats

+0

修改了使用angular foreach的代碼 – Geeky

0

我跳轉到心首先想到的是使用lodash函數:

let a = [{ id: 1, selected: false }]; 
let b = [{ id: 1, selected: false }, { id: 2, selected: true }]; 
let result = _.intersectionWith(a, b, _.isEqual); 

「結果」應與一個元素的數組,那部分匹配(即,「A」。)。

+0

好的提示,但我希望保持數組完好無損,只更新選定的屬性。 – Flignats

0

在只是簡單的Javascript:

$scope.listOne.filter(function(item) { 
    return !!$scope.listTwo.find(function(innerItem) { 
     innerItem.id == item.id; 
    }); 
}) 
.forEach(function(item) { 
    item.selected = true; 
}); 
+0

偉大的建議,試圖用angular.forEach – Flignats