问题
我有两个需要合并的Javascript对象数组。我需要通过匹配每个数组中包含的单个键:值对的唯一值来合并。我想要合并的值的键是不同的
我想基于匹配的唯一值将数组2中的键:值对添加到数组1中的正确对象。 array1.user和array2._id的值是我需要匹配的值。
数组
const array1 = [ { _id: 5c6c7132f9bf4bdab9c906ff,
user: 5c65d9438e4a834c8e85dd7d },
{ _id: 5c6ccd6d3a0dc4e4951c2bee,
user: 5c65d9438e4a834c8e85dd7e } ]
const array2 = users [ { _id: 5c65d9438e4a834c8e85dd7d,
info: { name: 'John', city: 'New York' } },
{ _id: 5c65d9438e4a834c8e85dd7e,
info: { name: 'Paneer', city: 'San Fran' } } ]
我试过的
我已经尝试过使用lodash的_.map和_.extend函数,但是我是lodash的新手并没有给我正确的输出
const mergedArray = _.map(array1, function(item){
return _.extend(item, _.find(array2, {_id: item.user}));
});
结果
mergedArray [ { _id: 5c65d9438e4a834c8e85dd7d,
info: { name: 'John', city: 'New York' } },
{ _id: 5c65d9438e4a834c8e85dd7e,
info: { name: 'Paneer', city: 'San Fran' } }]
期望的结果
const mergedArray = [ { _id: 5c6c7132f9bf4bdab9c906ff,
user: 5c65d9438e4a834c8e85dd7d,
info: { name: 'John', city: 'New York' } } ,
{ _id: 5c6ccd6d3a0dc4e4951c2bee,
user: 5c65d9438e4a834c8e85dd7e,
info: { name: 'Paneer', city: 'San Fran' } } ]
如果你的数组映射顺序相同,你可以避免使用find
const array1 = [ { _id: `5c6c7132f9bf4bdab9c906ff`,user: `5c65d9438e4a834c8e85dd7d` },{ _id: `5c6ccd6d3a0dc4e4951c2bee`,user: `5c65d9438e4a834c8e85dd7e` }]
const array2 =[ { _id: `5c65d9438e4a834c8e85dd7d`,info: { name: 'John', city: 'New York' } },{ _id: `5c65d9438e4a834c8e85dd7e`,info: { name: 'Paneer', city: 'San Fran' } } ]
const final = array1.map(e=> {
const found = array2.find(({_id}) => e.user === _id)
return {
...e,
info : found.info
}
})
console.log(final)
您可以使用Map
并为结果构建新对象。
const
array1 = [{ _id: '5c6c7132f9bf4bdab9c906ff', user: '5c65d9438e4a834c8e85dd7d' }, { _id: '5c6ccd6d3a0dc4e4951c2bee', user: '5c65d9438e4a834c8e85dd7e' }],
array2 = [{ _id: '5c65d9438e4a834c8e85dd7d', info: { name: 'John', city: 'New York' } }, { _id: '5c65d9438e4a834c8e85dd7e', info: { name: 'Paneer', city: 'San Fran' } }],
users = new Map(array2.map(({ _id, info }) => [_id, { info }])),
merged = array1.map(o => ({ ...o, ...(users.get(o.user) || {}) }));
console.log(merged);
.as-console-wrapper { max-height: 100% !important; top: 0; }
另一种方法是使用键生成对象,然后使用生成的对象直接获取值。密钥访问速度非常快。
const array1 = [ { _id: "5c6c7132f9bf4bdab9c906ff",user: "5c65d9438e4a834c8e85dd7d" },{ _id: "5c6ccd6d3a0dc4e4951c2bee",user: "5c65d9438e4a834c8e85dd7e" } ];
const ids = array1.reduce((a, {user, _id}) => ({...a, [user]: _id}), {});
const array2 = [ { _id: "5c65d9438e4a834c8e85dd7d",info: { name:'John', city: 'New York' } },{ _id: "5c65d9438e4a834c8e85dd7e", info: { name: 'Paneer', city: 'San Fran' } } ];
array2.forEach(o => {
o.user = o._id;
o._id = ids[o._id];
});
console.log(array2);
.as-console-wrapper { max-height: 100% !important; top: 0; }