将嵌套对象转换为数组

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

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 }); }); }); 

它工作,但我认为这不是“好”(即,有两个嵌套循环不好)。 有没有更好的方法来实现这一点(我可以想象,有一个相当优雅的纯function的解决scheme,但我想不出)?

使用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' } ]