Javascript 将具有数组值的对象转换为另一个对象数组
我有这样的目标:Javascript 将具有数组值的对象转换为另一个对象数组,javascript,arrays,ecmascript-6,reduce,Javascript,Arrays,Ecmascript 6,Reduce,我有这样的目标: { "John":[ { "address":"xxx1", "city":"yyy1" }, { "address":"xxx2", "city":"yyy
{
"John":[
{
"address":"xxx1",
"city":"yyy1"
},
{
"address":"xxx2",
"city":"yyy2"
}
],
"Doe":[
{
"address":"aaaa1",
"city":"aaa1"
}
],
"Smith":[
{
"address":"bbb1",
"city":"bbb1"
}
],
}
我试图实现的是减少这个对象,使其看起来像这样:
[
{
"name":"John",
"address":"xxx1",
"city":"yyy1"
},
{
"name":"John",
"address":"xxx2",
"city":"yyy2"
},
{
"name":"Doe",
"address":"aaaa1",
"city":"aaaa1"
},
{
"name":"Smith",
"address":"bbb1",
"city":"bbb1"
}
]
但我确信,通过使用ES6数组.reduce,同样的事情也可以以某种方式完成。你能帮助我吗?我看了JS(ES6):基于对象属性减少数组,但我无法理解
const modifiedData = Object.entries(data).reduce(function (acc, [key,value]) {
const personName = key;
return [
...acc,
{
Agent: personName ,
adress: value.adress
},
];
}, []);
如果要使用Array.prototype.reduce
,可以执行以下操作:
[
{
"name":"John",
"address":"xxx1",
"city":"yyy1"
},
{
"name":"John",
"address":"xxx2",
"city":"yyy2"
},
{
"name":"Doe",
"address":"aaaa1",
"city":"aaaa1"
},
{
"name":"Smith",
"address":"bbb1",
"city":"bbb1"
}
]
const输入={
“约翰”:[{
“地址”:“xxx1”,
“城市”:“yyy1”
},
{
“地址”:“xxx2”,
“城市”:“yyy2”
}
],
“能源部”:[{
“地址”:“aaaa1”,
“城市”:“aaa1”
}
],
“史密斯”:[{
“地址”:“bbb1”,
“城市”:“bbb1”
}],
}
// 1. 使用Object.keys()
const output1=Object.keys(input.reduce)(acc,person)=>{
输入[person].forEach(项目=>{
acc.push({name:person,…item})
})
返回acc;
}, []);
log('output1:',output1)
// 2. 使用Object.entries()
const output2=Object.entries(input.reduce)(acc[key,value])=>{
value.forEach(项=>{
acc.push({name:key,…item})
});
返回acc;
}, [])
log('output2:',output2)代码>您可以使用
const obj={
约翰:[
{
地址:“xxx1”,
城市:“yyy1”,
},
{
地址:“xxx2”,
城市:“yyyy2”,
},
],
能源部:[
{
地址:“aaaa1”,
城市:“aaa1”,
},
],
史密斯:[
{
地址:“bbb1”,
城市:“bbb1”,
},
],
};
const result=Object.entries(obj).reduce((acc,[key,arr])=>{
const collection=arr.map((a)=>({name:key,…a}));
acc=[…acc,…集合];
返回acc;
}, []);
控制台日志(结果)代码>像这样简单的方法
const data={“John”:[{“address”:“xxx1”,“city”:“yyyy1”},{“address”:“xxx2”,“city”:“yyyy2”}],“Doe”:[{“address”:“aaaaa1”,“city”:“aaa1”}],“Smith”:[{“address”:“bbb1”,“city”:“bbb1”}],};;
const result=Object.entries(data.flatMap)([key,values])=>
map(o=>({name:key,…o}));
控制台日志(结果)
使用.flatMap()
迭代对象的结果。entries()
并在回调中使用.map()
创建具有给定属性+名称的新对象。@Nguyen,你的解决方案也不错,但decpk的解决方案是第一个,它符合我的需要,所以我接受了他的答案。谢谢