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

Merge property from an array of objects into another based on property value lodash

本文关键字:数组 属性 合并 一个对象 lodash 对象      更新时间:2023-09-26

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

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});
  });
}

刚刚注意到保罗在我处理答案时回答了,但无论如何我都会添加我非常相似的代码:

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 }
});