Javascript 展平嵌套对象的数组
我有这样的数据:Javascript 展平嵌套对象的数组,javascript,Javascript,我有这样的数据: data = [ { "foo": {"name":"foo-name"}, "bar": {"name":"bar-name"} }, { "baz": {"name":"baz-name"} } ] 我想要的结果是: [ { "foo": {"name":"foo-name"}}, { "bar": {"name":"bar-name"}}, { "baz": {"name":"baz-name"}} ] 如何获得此结
data = [
{
"foo": {"name":"foo-name"},
"bar": {"name":"bar-name"}
},
{
"baz": {"name":"baz-name"}
}
]
我想要的结果是:
[
{ "foo": {"name":"foo-name"}},
{ "bar": {"name":"bar-name"}},
{ "baz": {"name":"baz-name"}}
]
如何获得此结构?我尝试使用concat
,但意识到它不起作用,因为我们处理的是嵌套对象,而不是嵌套数组。然后我尝试用不同的方式迭代,但没有达到我想要的效果。一次尝试如下:
const newData = data.map((x) => {
return Object.keys(x).map(el => {
return {[el]: x};
})
})
但这只是使它更加嵌套。一个选项是将
减少到数组中,迭代每个对象的条目并将它们推送到累加器:
const数据=[
{
“foo”:{“name”:“foo name”},
“酒吧”:{“名称”:“酒吧名称”}
},
{
“baz”:{“name”:“baz name”}
}
];
常量输出=数据减少((a,obj)=>{
Object.entries(obj.forEach)([key,val])=>{
a、 push({[key]:val});
});
返回a;
}, []);
控制台日志(输出)代码>您可以使用
let data=[{“foo”:{“name”:“foo name”},“bar”:{“name”:“bar name”},{“baz”:{“name”:“baz name”}]
让final=data.flatMap(a=>Object.entries(a).map([k,v])=>({
[k] :v
})))
console.log(final)
我会使用一个简单的来表示带有对象的
const result = [];
for (const obj of data) {
result.push(
...Object.entries(obj).map(
([key, value]) => ({[key]: value})
)
);
}
实例:
const数据=[
{
“foo”:{“name”:“foo name”},
“酒吧”:{“名称”:“酒吧名称”}
},
{
“baz”:{“name”:“baz name”}
}
];
常量结果=[];
用于(数据的常量对象){
结果:推(
…Object.entries(obj.map)(
([key,value])=>({[key]:value})
)
);
}
控制台日志(结果)代码>侧注:我们是否可以使用concat
而不是push
,这样我们就不需要传播explicitly@CodeManiac-concat
将创建一个新数组,因此代码将在所有地方创建新数组。这就是为什么我使用了push
@T.J.Crowder哦,是的,可能是一个离题的问题,因为JS让GC每次都创建一个新数组,而不是每次都将值推到同一个数组?CodeManiac-造成内存压力,这可能是性能问题的根源。但当然,这取决于此代码是一次性运行还是批量运行。这不重要的可能性很大。还要注意的是,理论上,上面涉及到创建一个对象(迭代器),以便为push
展开数组,因此它似乎是一个零和方程(创建数组或创建迭代器)——除了JavaScript引擎在可能的情况下优化了迭代器(如上所述)。如果我真的担心并且不知道,我会使用result.push.apply(result,/*…*/)
:-d此push
解决方案也仅适用于最多约30k个条目的阵列。(我假设OP的对象的属性不超过30k。)之后,V8上的堆栈就用完了。谢谢,upvote!代码狂人的回答在我看来是最整洁的,所以被接受的投票到了那里,但谢谢你的回答!