Преобразование вложенных объектов в массив

У меня есть объект, содержащий другие объекты, такие как:

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

Это работает, но я думаю, что это не "хорошо" (т.е. нехорошо иметь два вложенных цикла). Есть ли лучший способ для достижения этого (я могу себе представить, что есть довольно элегантное чисто функциональное решение, но я не могу думать о нем)?

Ответ 1

Использование карты и сокращение:

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