将具有相同名称的对象合并为一项

时间:2019-03-08 17:04:56

标签: javascript node.js

我想将具有相同名称的对象合并到一个项目数组中,但我不知道该怎么做。

我有一个像这样的数组:

  [ 
   { name: 'core/core.js',
     item: [ [Object] ] },
   { name: 'users/admin.js',
     item: [ [Object] ] },
   { name: 'users/admin.js',
     item: [ [Object] ] }
  ]

我想拥有类似的东西:

  [ 
   { name: 'core/core.js',
     item: [ [Object] ] },
   { name: 'users/admin.js',
     item: [
       [ [Object] ],
       [ [Object] ]
     ]
   },
  ]

这是我的代码:

const pathFile = [
  { name: 'core/core.js', item: [{ name: 'core' }] },
  { name: 'users/admin.js', item: [{ name: 'admin1' }] },
  { name: 'users/admin.js', item: [{ name: 'admin2' }] },
];
const obj = pathFile.reduce((a, name) => {
  if (!a[name]) {
    a[name] = { name, files: [] };
  }
  a[name].files.push({ name });
  return a;
}, {});
const arr = Object.values(obj);
console.log(JSON.stringify(arr));

1 个答案:

答案 0 :(得分:0)

您的问题是reduce()循环中的键使用了错误的值。在您的代码中,name指向reduce内的整个对象,因此您需要使用name.name作为键,因为在reduce中调用的每个项name循环具有name属性。最好使用其他参数名称,例如curr,这样更清楚。

const pathFile = [{ name: 'core/core.js', item: [{ name: 'core' }] },{ name: 'users/admin.js', item: [{ name: 'admin1' }] },{ name: 'users/admin.js', item: [{ name: 'admin2' }] },];

const obj = pathFile.reduce((a, curr) => {
    if (!a[curr.name])  a[curr.name] =  curr   
    else a[curr.name].item.push(...curr.item);
    return a;
}, {});
const arr = Object.values(obj);
console.log(arr)