动态解决方案以按对象数组分组

时间:2019-08-10 17:09:25

标签: javascript arrays

我正在尝试对一组对象进行分组。我要分组的数组可能会更改,我需要动态的解决方案。

这就是我要处理的数组的样子。

const arr = [
  {
      first: {
          label: 'a',
          key: 'a'
      },
      second: {
          label: 'b',
          key: 'b',
      }
  },
  {
      first: {
          label: 'aa',
          key: 'aa'
      },
      second: {
          label: 'bb',
          key: 'bb',
      }
  }
]

到目前为止,我已经尝试过:

const result = arr.reduce((acc, curr) => {
  acc['first'] = acc['first'] || [];
  acc['second'] = acc['second'] || [];
  acc['first'].push(curr.first);
  acc['second'].push(curr.second);

  return acc;
}, {});

这解决了我的问题,但这不是动态解决方案。

这是预期的结果:

const obj = {
  first: [
      {
          label: 'a',
          key: 'a'
      },
      {
          label: 'aa',
          key: 'aa'
      }
  ],
  second: [
      {
          label: 'b',
          key: 'b'
      },
      {
          label: 'bb',
          key: 'bb'
      }
  ]
}

2 个答案:

答案 0 :(得分:2)

要使其更通用,您只需要遍历键,而不是对first / second代码进行硬编码。看起来应该像这样:

const result = arr.reduce((acc, curr) => {
  let keys = Object.keys(curr);
  keys.forEach((key) => {
    acc[key] = acc[key] || [];
    acc[key].push(curr[key]);
  });
  return acc;
}, {});

答案 1 :(得分:1)

您可以使用reduceObject.entries

const arr = [{first: {label: 'a',key: 'a'},second: {label: 'b',key: 'b',}},{first: {label: 'aa',key: 'aa'},second: {label: 'bb',key: 'bb',}}]

let final = arr.reduce((op, inp) => {
  Object.entries(inp).forEach(([key, value]) => {
    op[key] = op[key] || []
    op[key].push(value)
  })
  return op
},{})

console.log(final)