根据属性值lodash将属性从一组对象合并到另一个对象

tes*_*123 1 javascript arrays object lodash

我有2个对象数组,它们各有一个id共同点.如果它们具有匹配的ids ,我需要将数组2的对象添加到对象数组1中的属性.

数组1:

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

]
Run Code Online (Sandbox Code Playgroud)

数组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
    },

]
Run Code Online (Sandbox Code Playgroud)

期望的结果:

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

]
Run Code Online (Sandbox Code Playgroud)

我尝试使用lodash _.merge函数但是当我只想eyeColour添加时,我最终将所有属性放入一个数组中.

小智 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));
}
Run Code Online (Sandbox Code Playgroud)

对于非ES6环境,使用传统语法重写箭头函数.如果 Array#find没有,请自己编写或使用等效的.因为Object.assign,如果您更喜欢使用自己的等效物,例如_.extend.

这将合并所有的属性array2array1.仅合并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});
  });
}
Run Code Online (Sandbox Code Playgroud)