2016-01-14 133 views
0

我有2個對象數組,它們每個都有一個共同的id。如果數組2的對象匹配id s,我需要將數組2的對象添加到對象數組1中。根據屬性值將對象數組中的屬性合併到另一個屬性lodash

陣列1:

[ 
    { 
     id: 1, 
     name: tom, 
     age: 24 
    }, 
    { 
     id: 2, 
     name: tim, 
     age: 25 
    }, 
    { 
     id: 3, 
     name: jack, 
     age: 24 
    }, 

] 

陣列2:

[ 
    { 
     id: 1, 
     gender: male, 
     eyeColour: blue, 
     weight: 150 
    }, 
    { 
     id: 2, 
     gender: male, 
     eyeColour: green, 
     weight: 175 
    }, 
    { 
     id: 3, 
     gender: male, 
     eyeColour: hazel, 
     weight: 200 
    }, 

] 

期望的結果:

[ 
    { 
     id: 1, 
     name: tom, 
     age: 24, 
     eyeColour: blue, 
    }, 
    { 
     id: 2, 
     name: tim, 
     age: 25, 
     eyeColour: green, 
    }, 
    { 
     id: 3, 
     name: jack, 
     age: 24, 
     eyeColour: hazel, 
    }, 

] 

我嘗試使用lodash _.merge功能,但然後我結束了所有屬性到一個數組,當我只想要eyeColour添加。

+0

這些不是關聯數組。它們是對象的數組。 JS中不使用術語「關聯數組」。 –

+0

刪除了這個詞,任何想法如何解決這個問題? – tester123

回答

2

只注意到保羅回答,而我是工作在我的答案,但無論如何,我會加上我非常相似的代碼:

var getEyeColour = function (el) { return _.pick(el, 'eyeColour'); } 
var out = _.merge(arr1, _.map(arr2, getEyeColour)); 

DEMO

+1

我錯過了什麼,或者這個解決方案是否假設兩個數組中元素的順序是相同的? –

+1

是的,這是一個錯誤。 OP你應該可以忽略這一點。 – Andy

1

您可以使用pick合併之前只得到你想要的屬性:

var result = _.merge(arr1, _.map(arr2, function(obj) { 
    return _.pick(obj, 'id', 'eyeColour'); 
})); 
+1

@安迪謝謝你解決這個問題。 – Paulpro

+0

不太確定這一點。挑選'id'有什麼意義?它會覆蓋第一個數組中的一個(可能不同的)ID。 –

0

溶液在普通的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>');

5

Lodash仍然非常實用的軟件包,但隨着ES6的出現,它的一些使用案例不那麼引人注目。

對於第一個數組中的每個對象(person),在第二個數組中找到匹配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}); 
    }); 
} 
相關問題