【问题标题】:Flattening conditional nested lists to a single flat list将条件嵌套列表展平为单个平面列表
【发布时间】:2021-02-25 23:38:46
【问题描述】:

Lodash 扁平化嵌套列表。

我的 Typescript 脚本中有一个函数,用于转换一些对象。

不幸的是,有些对象是嵌套的,所以返回类型有时会是一个嵌套列表。

const values: (IRobotics | IRobotics[][])[] //this is an interface type i described

我使用 LoDash FlatMap 函数尝试将其展平,但它仍然为每个对象提供一个嵌套级别。

当响应到来时,它只删除外部列表。

我最初尝试使用_.flatMap() 函数, const parsedValues = _.flatMap(values) as IRobotics[];

然而,嵌套列表中的值仍然嵌套了一层太深(例如,参见图片)。

类型是正确的,但我只想要一个对象列表而不是嵌套列表(在 IRobotics[][] 的示例中会发生这种情况)

有人有一个很好的解决方案来从这里展平一个条件两层数组吗?

整个函数供参考。 values 属性是返回初始值的地方

  static createFromeData(item: EveryMatrix) {
    const values = Object.entries(item).map(entry => {
      return this.createFromEntry(entry);
    });
    const nestedValues = values.filter(entry => Array.isArray(entry));
    const parsedValues = _.flatMap(values) as IRobotics[];
    const IRobotics = new IRoboticsEveryMatrix(parsedValues);
    return IRobotics;
  }

【问题讨论】:

  • 我不知道如何为 lodash 回答这个问题,但截至 ES2019,JavaScript 有 Array.prototype.flat()(以及 flatMap,但你不是映射,只是扁平化)可以将like thisdepth 参数一起使用,并且输出自动是您想要的。如果您的运行时环境没有flat(),您可以填充它。

标签: node.js typescript lodash


【解决方案1】:

使用Array.flatMap() 代替Array.map()

const values = Object.entries(item).flatMap(entry =>
  this.createFromEntry(entry)
);

如果你正确的环境不支持它,请使用_.flatMap():

const values = _.flatMap(Object.entries(item), entry =>
  this.createFromEntry(entry)
);

如果你想展平一个数组数组(因为你需要为nestedValues嵌套列表),你可以使用Array.flat()_.flatten()

const parsedValues = values.flat as IRobotics[];

或者

const parsedValues = _.flatten(values) as IRobotics[];

【讨论】:

    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多