我有一个包含一些对象的数组,我试图将它们组合成一个对象
[
{ 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]
}
}
]
答案 0 :(得分:1)
您可以使用reduce
和destructuring根据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)