将嵌套对象转换为数组
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。无论如何,我会坚持使用我的原始版本;-)
尝试看看其他方法是否能提供一些真正有益的东西是件好事。你的方法更清楚发生了什么。以上是关于将嵌套对象转换为数组的主要内容,如果未能解决你的问题,请参考以下文章