如果它具有相同的 id,我想将值合并到数组中。我有一组这样的对象。
[
{
id: 'Tony',
type: 'hero',
favorite: 'Rosie',
},
{
id: 'Jane',
type: 'human',
favorite: null,
},
{
id: 'Tony',
type: 'hero',
favorite: 'Lisa',
},
{
id: 'Steve',
type: 'hero',
favorite: 'Jennie',
},
{
id: 'Tony',
type: 'hero',
favorite: 'Jisoo',
},
]
Run Code Online (Sandbox Code Playgroud)
我想将键favorite从字符串合并到数组。我想要这样的输出
[
{
id: 'Tony',
type: 'hero',
favorite: ['Rosie', 'Lisa', 'Jisoo'],
},
{
id: 'Jane',
type: 'human',
favorite: null,
},
{
id: 'Steve',
type: 'hero',
favorite: ['Jennie'],
}
Run Code Online (Sandbox Code Playgroud)
我尝试编写这样的代码:(来自:Sumimilarkeysin an array ofobjects)
var obj = [
{
id: 'Tony',
type: 'hero',
favorite: 'Rosie',
},
{
id: 'Jane',
type: 'human',
favorite: null,
},
{
id: 'Tony',
type: 'hero',
favorite: 'Lisa',
},
{
id: 'Steve',
type: 'hero',
favorite: 'Jennie',
},
{
id: 'Tony',
type: 'hero',
favorite: 'Jisoo',
},
];
var holder = {};
const ar = []
obj.forEach(function (d) {
if (holder.hasOwnProperty(d.id)) {
holder[d.id] = ar.push(holder[d.id] + d.favorite);
} else {
holder[d.id] = d.favorite;
}
});
var obj2 = [];
for (var prop in holder) {
obj2.push({ name: prop, favorite: holder[prop] });
}
console.log(obj2);
Run Code Online (Sandbox Code Playgroud)
但输出是
[ { name: 'Tony', favorite: 2 },
{ name: 'Jane', favorite: null },
{ name: 'Steve', favorite: 'Jennie' } ]
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点 ?
您可以使用单个Array.reduce来完成此操作,并且很可能是最简单且性能最高的方法:
var data = [ { id: 'Tony', type: 'hero', favorite: 'Rosie', }, { id: 'Jane', type: 'human', favorite: null, }, { id: 'Tony', type: 'hero', favorite: 'Lisa', }, { id: 'Steve', type: 'hero', favorite: 'Jennie', }, { id: 'Tony', type: 'hero', favorite: 'Jisoo', }, ]
let result = data.reduce((r, {id,type,favorite}) => {
r[id] = r[id] || {id, type, favorite: []}
r[id].favorite.push(favorite)
return r
}, {})
console.log(Object.values(result))Run Code Online (Sandbox Code Playgroud)
这个想法是“分组” id,然后favorites在每次迭代中继续推送到数组。
因为ES5你可以用类似的方式做到这一点:
var data = [ { id: 'Tony', type: 'hero', favorite: 'Rosie', }, { id: 'Jane', type: 'human', favorite: null, }, { id: 'Tony', type: 'hero', favorite: 'Lisa', }, { id: 'Steve', type: 'hero', favorite: 'Jennie', }, { id: 'Tony', type: 'hero', favorite: 'Jisoo', }, ]
let result = data.reduce(function(r, c){
r[c.id] = r[c.id] || {id: c.id, type: c.type, favorite: []}
r[c.id].favorite.push(c.favorite)
return r
}, {})
console.log(Object.values(result))Run Code Online (Sandbox Code Playgroud)
确实没有必要lodash实现这一点。