簡體   English   中英

根據條件用另一個數組的元素替換一個數組的元素

[英]Replace elements of an array with elements of another array based on a condition

我有 2 個數組,

let array1 = ["1", "2", "3"]

let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}]

array1元素和array2 id元素的值匹配時,我想用array2 的元素替換array1的內容。 結果應該是這樣的:

array1 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}]

我知道我可以在單獨的數組中獲得結果,但我想替換 array1 的內容而不必創建新數組。

我試過這個:

array1.splice(0, Infinity, ...array2)

基於對類似問題的回答here

這導致:

array1 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}]

我嘗試了不同的方法向此語句添加條件但失敗了。 有沒有辦法在上面的拼接方法中添加條件? 或者如果有更好的方法來實現它,請提出建議。

您還可以在 array1 中搜索 array2 id,然后用匹配的 array2 索引替換 array1 的索引。

 let array1 = ["1", "2", "3"] let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}] array2.forEach(function(e){ if(array1.indexOf(e["id"]) != -1) { array1[array1.indexOf(e["id"])] = e } }) console.log(array1)

編輯:我嘗試了一種不同的方法,通過將 array1 中的每個值與過濾器中 array2 id 的值進行比較來映射,我認為這不是一個更清晰的解決方案,但我嘗試過:

 let array1 = ["1", "2", "3"] let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}] array1 = array1.map(num => { return array2.filter(dict => { if(dict["id"] == num) {return dict} })[0] }) console.log(array1)

如果你可以使用 lodash,它很短:

 let array1 = ["1", "2", "3"] let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}] array1 = _.map(array1, function(o){return _.find(array2, {id: o})}) console.log(array1)
 <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

看起來Array.filter可以完成這項工作嗎?

 let array1 = ["1", "2", "3"]; array1 = [ {"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"} ].filter(v => array1.includes(v.id)); // using Array.indexOf (IE >= 9, nodejs all versions), let array2 = ["1", "2", "3"]; array2 = [ {"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"} ].filter(v => array2.indexOf(v.id) > -1); console.log(array1); console.log(array2);

我們可以使用keyed collection - Map通過 key 獲取項目。

 const array1 = ["1", "2", "3"] const array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}] const array2Map = new Map(array2.map(o=> [o.id, o])); const result = array1.map(o => ({ ...array2Map.get(o) })); console.log(result);

此外,您可以使用filtersome方法來達到預期的效果:

 let array1 = ["1", "2", "3"] let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}] array1 = array2.filter(f=> array1.some(s=> s == f.id)); console.log(array1);

另一種方式,但更冗長而不是最佳:

 let array1 = ["1", "2", "3"] let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}] array1 = array1.map(a => { let obj = array2.find(a2=> a2.id == a); if (obj) return obj; return a; }) console.log(array1);

 let array1 = ["1", "2", "3"] let array2 = [{"name": "a", "id" : "1"}, {"name": "b", "id" : "2"}, {"name": "c", "id" : "3"}, {"name": "c", "id" : "4"}] array1 = array2.filter(f=> array1.find(s=> s == f.id)); console.log(array1); /**outPut :[ { "name": "a", "id": "1" }, { "name": "b", "id": "2" }, { "name": "c", "id": "3" } ]**/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM