代码之家  ›  专栏  ›  技术社区  ›  Golo Roden

将嵌套对象转换为数组

  •  3
  • Golo Roden  · 技术社区  · 10 年前

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

    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 回复  |  直到 10 年前
        1
  •  2
  •   tlehman    10 年前

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