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!代码狂人的回答在我看来是最整洁的,所以被接受的投票到了那里,但谢谢你的回答!