将具有奇怪结构的多个对象组合为一个

时间:2019-05-14 07:12:01

标签: javascript arrays object

我有一个包含一些对象的数组,我试图将它们组合成一个对象

[
  { user: { '563D': { pId: '12', seasion: '120', value: true } } },
  { user: { '563D': { pId: '11', seasion: '120', value: false } } },
  ...
] 
  • pId是唯一的
  • seasion对于每个对象都是相同的(几乎永不改变)
  • value可以是任何东西

我想要这样的东西:

{
  id: '563D',
  seasion: '120',
  types: {
    12: // pId
    {
      value: true
    },
    11:
    {
      value: false
    }
  }
}

我尝试使用reduce和forEach但无法实现我的目标 由于对这两种方法的了解不足。

EDIT

忘记了几个用户的输入,对不起

[
  {
    users: {
      '563D': [Object],
      '4b07': [Object]
    }
  },
  {
    users: {
      '563D': [Object],
      '4b07': [Object]
    }
  },
  {
   users: {
      '563D': [Object],
      '4b07': [Object]
    }
  }
]

1 个答案:

答案 0 :(得分:1)

您可以使用reducedestructuring根据user中的第一个键对对象进行分组。然后使用Object.values()获取每个组值的数组:

  • 通过分解参数从每个对象获取user
  • user中的第一个entry进行解构以分别获取密钥(例如'563D')和嵌套属性)
  • 使用||运算符检查累加器是否已经具有id作为其属性。如果是,请使用它。否则,用{ id, seasion, types: {} }分配一个新值。这是使用Shorthand property names
  • types作为键,以pId作为值来更新{ value }

const input = [{user:{'563D':{pId:'12',seasion:120,value:true}, '4b07':{pId:'12',seasion:120,value:true}}},{user:{'563D':{pId:'11',seasion:120,value:false},'4b07':{pId:'11',seasion:120,value:false}}}]

const output = input.reduce((r, { user }) => {
  for(const [id, { pId, seasion, value }] of Object.entries(user)) {
    r[id] = r[id] || { id, seasion, types: {} };
    r[id].types[pId] = { value };
  }
  return r;
}, {})

console.log(Object.values(output))

如果阵列中只有一个唯一的id,则可以将reduce简化为:

const input = [{user:{'563D':{pId:'12',seasion:120,value:true}}},{user:{'563D':{pId:'11',seasion:120,value:false}}}]

const output = input.reduce((r, { user }) => {
  const [id, { pId, seasion, value }] = Object.entries(user)[0];
  return { id, seasion, types: { ...r.types, [pId]: { value } } }
}, {})

console.log(output)