[英]Merge property from an array of objects into another based on property value lodash
我有 2 個對象數組,它們每個都有一個共同的
id<\/code> 。
如果它們具有匹配的
id<\/code> ,我需要將數組 2 的對象的屬性添加到對象數組 1 中。
陣列 1:
[
{
id: 1,
name: tom,
age: 24
},
{
id: 2,
name: tim,
age: 25
},
{
id: 3,
name: jack,
age: 24
},
]
Lodash仍然是非常有用的實用程序包,但是隨着ES6的出現,它的一些用例變得不那么吸引人了。
對於第一個數組中的每個對象(人),請在第二個數組中找到具有匹配ID的對象(請參見函數findPerson
)。 然后合並兩者。
function update(array1, array2) {
var findPerson = id => array2.find(person => person.id === id);
array1.forEach(person => Object.assign(person, findPerson(person.id));
}
對於非ES6環境,請使用傳統語法重寫箭頭功能。 如果Array#find
不可用,請自行編寫或使用等效的方法。 對於Object.assign
,如果您喜歡使用自己的等效項,例如_.extend
。
這會將所有屬性從array2
合並到array1
。 只合並eyeColour
:
function update(array1, array2) {
var findPerson = id => array2.find(person => person.id === id);
array1.forEach(person => {
var person2 = findPerson(person.id));
var {eyeColour} = person2;
Object.assign(person, {eyeColour});
});
}
剛剛注意到Paul在我回答問題時回答了,但是無論如何我都會添加非常相似的代碼:
var getEyeColour = function (el) { return _.pick(el, 'eyeColour'); }
var out = _.merge(arr1, _.map(arr2, getEyeColour));
您可以使用pick在合並前僅獲取所需的屬性:
var result = _.merge( arr1, _.map( arr2, function( obj ) {
return _.pick( obj, 'id', 'eyeColour' );
}));
普通Javascript解決方案
這是一種更為通用的解決方案,用於合並兩個具有不同屬性的數組,以使用一個公共鍵在一個對象中合並並添加一些屬性。
var array1 = [{ id: 1, name: 'tom', age: 24 }, { id: 2, name: 'tim', age: 25 }, { id: 3, name: 'jack', age: 24 }, ], array2 = [{ id: 1, gender: 'male', eyeColour: 'blue', weight: 150 }, { id: 2, gender: 'male', eyeColour: 'green', weight: 175 }, { id: 3, gender: 'male', eyeColour: 'hazel', weight: 200 }, ]; function merge(a, b, id, keys) { var array = [], object = {}; function m(c) { if (!object[c[id]]) { object[c[id]] = {}; object[c[id]][id] = c[id]; array.push(object[c[id]]); } keys.forEach(function (k) { if (k in c) { object[c[id]][k] = c[k]; } }); } a.forEach(m); b.forEach(m); return array; } document.write('<pre>' + JSON.stringify(merge(array1, array2, 'id', ['name', 'age', 'eyeColour']), 0, 4) + '</pre>');
我一直在尋找相同的東西,但我想在合並之前匹配 Id
在我的情況下,第二個數組可能有不同數量的項目,最后我得到了這個:
var out = arr1.map(x => {
return { ...x, eyeColour: arr2.find(y => x.id === y.id)?.eyeColour }
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.