[英]Merge array with underscore by keys
我有2個數組:
[{id:1,name:"name"},{id:2,name:"name2"} ,{id:3,name:"name3"}]
[{id:1,date:"123"},{id:2,date:"456"}]
僅當id相等時才應更新數組1:因此,數組1看起來像
它不應創建新的數組。 僅基於陣列2更新陣列1
[{id:1,name:"name",date:"123"},{id:2,name:"name2",date:"456"} ,{id:3,name:"name3"}]
我設法通過在array2
上的for循環和for過濾器內執行以下操作:
._filter(array1,function(item){
If(item.id=array2.id)
Do smth and update the array1.date
})
我如何以他最好的方式做到這一點? 使用underscore.js
您可以使用以下本地語言來做到這一點:
const arr1 = [{id:1,name:"name"},{id:2,name:"name2"} ,{id:3,name:"name3"}]; const arr2 = [{id:1,date:"123"},{id:2,date:"456"}]; arr1.forEach((ele) => { const match = arr2.find(item => ele.id === item.id) || {}; Object.assign(ele, match); }); console.log(arr1);
您可以執行以下操作:
遍歷array1並使用some()
方法檢查每個項目的ID是否在array2中。
var arr1 = [{id:1,name:"name"},{id:2,name:"name2"} ,{id:3,name:"name3"}]; var arr2 = [{id:1,date:"123"},{id:2,date:"456"}]; var missing = []; arr1.forEach( (item1, i) => { var isExist = arr2.some(item2 => item2.id === item1.id) if(!isExist) { missing.push(i); } }) missing.forEach(item => { arr2.push(arr1[item]); }) console.log(arr2);
一些參考
嘗試這個 :
var a = [{id:1,name:"name"},{id:2,name:"name2"} ,{id:3,name:"name3"}] ; var b = [{id:1,date:"123"},{id:2,date:"456"}] ; var i = 0, j = 0 ; while( i < a.length ) { j = 0 ; while( j < b.length) { if ( a[i].id === b[j].id ) Object.assign( a[i] , b[j] ); j++; } i++; } console.log(a) ;
您可以使用forEach
遍歷第二個數組,並使用findIndex
從第一個數組獲取匹配的元素。 如果id
匹配,則更新第一個數組中的對象
let arr1 = [{ id: 1, name: "name" }, { id: 2, name: "name2" }, { id: 3, name: "name3" }] let arr2 = [{ id: 1, date: "123" }, { id: 2, date: "456" }] arr2.forEach(function(acc) { let findArry1Index = arr1.findIndex(function(item) { return item.id === acc.id; }); if (findArry1Index !== -1) { arr1[findArry1Index].date = acc.date; } }); console.log(arr1)
var a = [{id:1,name:"name"},{id:2,name:"name2"} ,{id:3,name:"name3"}];
var b = [{id:1,date:"123"},{id:2,date:"456"}];
a = _.map(a, function(e) { return _.extend(e, _.findWhere(b, {id: e.id})); });
結果在:
0: {id: 1, name: "name", date: "123"}
1: {id: 2, name: "name2", date: "456"}
2: {id: 3, name: "name3"}
但是,我猜這符合“創建新數組”的資格嗎? 也許可以通過¯\\ _(ツ)_ /¯來獲得啟發。
您可以使用下划線的indexBy
函數通過id
來索引第二個數組,然后只需使用Object.assign(...)
通過在索引元素對象中執行查找來更新具有相應匹配項的第一個數組元素。
let arr1 = [{id:1, name:"name"}, {id:2, name:"name2"}, {id:3, name:"name3"}] let arr2 = [{id:1, date:"123"}, {id:2, date:"456"}] const arr2Groups = _.indexBy(arr2, e => e.id); arr1.forEach(e => Object.assign(e, arr2Groups[e.id] || {})); console.log(arr1);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.