将嵌套对象转换为数组

Posted

技术标签:

【中文标题】将嵌套对象转换为数组【英文标题】:Transforming nested objects to an array 【发布时间】:2015-03-26 14:25:04 【问题描述】:

我有一个包含其他对象的对象,例如:

let foo = 
  a: 
    b: ,
    c: 
  ,
  d: 
    e: 
  
;

现在我想把这个转换成一个对象数组,其中前两级的键组成一个键/值对,比如:

let transformedFoo = [
   outer: 'a', inner: 'b' ,
   outer: 'a', inner: 'c' ,
   outer: 'd', inner: 'e' 
];

我目前的做法是这样的:

let fooTransformed = [];

Object.keys(foo).forEach(function (outerKey) 
  Object.keys(foo[outerKey]).forEach(function (innerKey) 
    fooTransformed.push(
      outer: outerKey,
      inner: innerKey
    );
  );
);

它有效,但我认为它不是“好”(即,有两个嵌套循环并不好)。有没有更好的方法来实现这一点(我可以想象有一个非常优雅的纯功能解决方案,但我想不出任何方法)?

【问题讨论】:

it seems 你的方法是公认的。 从逻辑上讲,嵌套操作需要另一个嵌套循环(或条件循环)。 “功能性”方法只会将这一事实隐藏起来。 @DavidPullar 是对的,而不是嵌套循环,您将拥有一个嵌套映射,加上一个 reduce 以使结果变平。见below 【参考方案1】:

使用 map 和 reduce:

> Object.keys(foo).map(function(key)  
      return Object.keys(foo[key]).map(function(val) 
          return outer: key, inner: val  ) 
      ).reduce(function(a,b)  return a.concat(b) )

[  outer: 'a', inner: 'b' ,
   outer: 'a', inner: 'c' ,
   outer: 'd', inner: 'e'  ]

【讨论】:

如果将第一个 map 与最后一个 reduce 结合起来,您可以对此进行改进并保留原来的两个循环。 Object.keys(foo).reduce(function(reduced, key) return reduced.concat(Object.keys(foo[key]).map(function(val) return outer: key, inner: val )) , []); 它有效,而且它是一种实用的方法,因此我接受了它并+1。无论如何,我会坚持使用我的原始版本;-) 尝试看看其他方法是否能提供一些真正有益的东西是件好事。你的方法更清楚发生了什么。

以上是关于将嵌套对象转换为数组的主要内容,如果未能解决你的问题,请参考以下文章

将嵌套对象转换为数组

如何将对象数组转换为嵌套对象?

如何将嵌套对象转换为数组数组

如何将嵌套数组对转换为数组中的对象

将嵌套的 mongoDB 文档转换为平面 pandas DataFrame(对象数组中的对象数组)

将 MongoDB 集合转换为嵌套对象数组