我有2个对象数组,它们各有一个共同的id
。如果数组2的对象添加到对象数组1,我需要一个属性,如果它们匹配id
s。
数组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 :(得分:6)
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});
});
}
答案 1 :(得分:2)
刚刚注意到Paul在我的答案中做出了回答,但我还是会添加我非常相似的代码:
var getEyeColour = function (el) { return _.pick(el, 'eyeColour'); }
var out = _.merge(arr1, _.map(arr2, getEyeColour));
答案 2 :(得分:1)
您可以使用pick在合并前仅获取所需的属性:
var result = _.merge( arr1, _.map( arr2, function( obj ) {
return _.pick( obj, 'id', 'eyeColour' );
}));
答案 3 :(得分:1)
普通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>');
&#13;