【问题标题】:Can I change the type of the accumulator on the .reduce method?我可以在 .reduce 方法上更改累加器的类型吗?
【发布时间】:2021-12-21 18:28:12
【问题描述】:

我目前正在尝试将字符串简化为数字 [],但我是 typescript 的新手,根本不知道如何键入我的代码,以便 typescript 编译器停止抱怨...

我想做什么:

matString.split(/[\n ]/).reduce((acc, cur, index) => acc[index] = Number(cur));

到目前为止,我已经尝试过这样输入,但它不起作用:(

matString.split(/[\n ]/).reduce((acc: Array<number>, cur, index) => acc[index] = Number(cur)) as Array<number>;

仅出于上下文考虑,此代码正在接收字符串格式的矩阵,我想将其转换为数组以便我可以使用它。我已经在不同的情况下遇到了这个问题并且不得不解决它,但是这次我想了解如何解决它。

另外,如果它确实有助于更好地解释我的问题,这里是我的代码图片和编译器的错误:code image with error

这是我对thisexercism 练习的解决方案的一部分。

【问题讨论】:

  • 首先,您缺少初始值。如果数组为空,reduce 应该返回什么?
  • 请记住,如果不将数字转换回字符串,则无法将其拆分为数字。您链接到的练习没有提到类型,只是您应该能够将字符串中的每个字符作为矩阵的元素访问,所以也许要关注数组的 shape 开始.

标签: javascript arrays string typescript reduce


【解决方案1】:

虽然可能,但避免.reduce 并将拆分字符串映射到Number 会容易得多,无需显式输入:

const result = matString
  .split(/[\n ]/)
  .map(Number);

如果一定要走.reduce路线,使用泛型来表示累加器类型,记得在回调结束时返回累加器:

const result = matString.split(/[\n ]/).reduce<Array<number>>((acc, cur, index) => {
    acc[index] = Number(cur);
    return acc;
}, []);

如果输入由包含数字字符的字符串组成,最好匹配这些字符,而不是在换行符和空格上分割:

const result = matString
  .match(/\d+(?:\.\d+)?/g) // assuming there will always be at least one match
  .map(Number);

【讨论】:

  • 谢谢!这解决了我的问题,我现在已经学会了如何解决来自 typescript 的这些警告 :)
  • 另外,我需要通过 \n 字符分隔进入该字符串的矩阵的行和列,表示行的末尾。仍在考虑如何做到这一点,但像这样拆除字符串似乎是一个合乎逻辑的步骤。
  • 如果保证每一行都包含您要解析的内容,则在换行符处拆分,然后将每一行映射到您想要的解析结构。 .split('\n').map(line =&gt; line.match(/\d+/g).map(Number)) 或类似的东西
猜你喜欢
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2012-09-26
  • 2020-08-15
  • 2014-09-20
  • 1970-01-01
  • 2022-07-19
相关资源
最近更新 更多