簡體   English   中英

"根據屬性值 lodash 將對象數組中的屬性合並到另一個對象中"

[英]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.

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