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

时间:2016-01-14 16:44:53

标签: javascript arrays object lodash

我有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时,我最终将所有属性放到一个数组中。

4 个答案:

答案 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));

DEMO

答案 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;
&#13;
&#13;