【问题标题】:What's a terse es6 way of flattening a nested object?什么是扁平化嵌套对象的简洁 es6 方式?
【发布时间】:2019-02-18 20:20:09
【问题描述】:

例如转这个:

const enums = { ip: 'ip', er: 'er' };

const obj = {
  somethingNotNeeded: {...},
  er: [
    { a: 1},
    { b: 2}
  ],
  somethingElseNotNeeded: {...},
  ip: [
    { a: 1},
    { b: 2}
  ]
}

进入这个:

[
  { a: 1},
  { b: 2},
  { a: 1},
  { b: 2}
]

我已经通过声明我想要的类型的枚举对象 (er, ip) 然后在 obj 上执行 forEach (lodash) 循环来检查键是否不在枚举中并删除他们脱离了原始的 obj。然后只有我想要的对象,我执行两个嵌套的 forEach 循环,使用 object rest spread 将结果连接到一个新对象......

我几乎完全确定有更好的方法来做到这一点,但我今天没有想到。

【问题讨论】:

  • 如果你已经在使用 lodash,那么还有一个更好更干净的方法!如果您对此表示满意(使用 lodash),我可以向您展示使用 lodash 的简单方法。

标签: javascript object ecmascript-6 lodash


【解决方案1】:

const props = ['ip', 'er']; // An array of the properties you are interested in

const obj = {
  somethingNotNeeded: {},
  er: [
    { a: 1},
    { b: 2}
  ],
  somethingElseNotNeeded: {},
  ip: [
    { a: 1},
    { b: 2}
  ]
}

const flatten = (array) => array ? array.reduce((output, array) => [...output, ...array], []) : array; // Take an array of arrays and flatten it into a single array

const result = flatten(props.map(p => obj[p])); //Run the flattern over an array that has been created by mapping the property names

console.log(result)

【讨论】:

    【解决方案2】:

    由于您在最终输出中没有使用enumskey,因此我们可以简单地使用Array 来代替对象。

    const enums = ['ip', 'er'];
    
    const obj = {
      somethingNotNeeded: {},
      er: [
        { a: 1 },
        { b: 2 },
      ],
      somethingElseNotNeeded: {},
      ip: [
        { a: 1 },
        { b: 2 }
      ]
    };
    
    const result = enums.reduce((acl, curr) => acl.concat(obj[curr]), []);
    console.log(result);  
    

    这应该可以解决问题。

    【讨论】:

      【解决方案3】:

      使用Object.values()(或Object.keys(),如果它们始终相同)获取enums 属性。使用Array.map() 迭代属性名称数组,并从obj 中提取它们的值。通过spreading将数组的数组展平成Array.concat()

      const enums = { ip: 'ip', er: 'er' };
      
      const obj = {
        somethingNotNeeded: {},
        er: [
          { a: 1},
          { b: 2}
        ],
        somethingElseNotNeeded: {},
        ip: [
          { a: 1},
          { b: 2}
        ]
      };
      
      const result = [].concat(...Object.values(enums).map(p => obj[p]));
      
      console.log(result);

      【讨论】:

        猜你喜欢
        • 2023-04-08
        • 2018-11-07
        • 2019-12-07
        • 1970-01-01
        • 1970-01-01
        • 2017-03-19
        • 1970-01-01
        • 2020-07-06
        • 1970-01-01
        相关资源
        最近更新 更多