【问题标题】:Efficient way to create array of all digit strings [duplicate]创建所有数字字符串数组的有效方法[重复]
【发布时间】:2020-12-10 04:26:49
【问题描述】:

我想创建一个数字数组。 我目前只是对其进行硬编码

const digitGeneration = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];

我知道在其他语言中,我可以使用整数的范围运算符创建一个数组。我希望我可以在 JS 中做类似的事情。相反,我想出了这个

const digitGeneration = [...Array(10).keys()].map(digit => digit.toString());

谁有更简单的方法?还是仅仅硬编码它并节省执行时间以提高效率是不值得更好的?

【问题讨论】:

  • 当你遇到瓶颈时效率就来了,在这里你正在尝试做一个不会产生任何显着差异的微优化。
  • [...Array(10).keys()].map(String)Object.keys(Array(10).fill())

标签: javascript node.js arrays string


【解决方案1】:

你可以传播一个数字。

Number.prototype[Symbol.iterator] = function* () {
    for (var i = 0; i < this; i++) yield i.toString();
};

console.log([...10]);

【讨论】:

  • 但是现在你不能再传播数字类型了......更改数字原型似乎是个坏主意,因为它会影响所有其他代码。
【解决方案2】:

使用 JavaScript,除非您要构建 CPU 密集型库或每秒调用数千次的函数,否则微优化毫无意义。比起代码长度,我更喜欢清晰,所以我可能会这样做:

const digitGeneration = Array(10);
for (let i = 0; i < 10; ++i) {
  digitGeneration[i] = i.toString();
}

不过,你这样做的方式非常好。我想如果你想要一个通用的range() 就像在 python 中一样,你可以创建一个生成器:

function* range(startVal, endVal, step = 1) {
  const stepSign = Math.sign(step);
  if (stepSign === 0) {
    throw new TypeError('step cannot be 0');
  }
  if (arguments.length == 0) {
    throw new TypeError('no range specified');
  }
  if (arguments.length == 1) {
    endVal = startVal;
    startVal = 0;
  }
  for (let i = startVal; Math.sign(endVal - i) === stepSign; i += step) {
    yield i;
  }
}

由于没有创建数组,因此出于迭代目的,这与 for 循环一样有效,即使对于大范围也是如此。

for (const value of range(10000, 1, -1)) {
  console.log(value);
}
// Outputs 10000...2 separated by newline without taking 10KB of memory

或者您可以创建一个数组,就像您尝试做的那样:

const digitGeneration = [...range(10)].map(e => e.toString());
// This is ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

【讨论】:

  • 范围迭代器肯定会非常高效。
【解决方案3】:

你可以在字符串上使用spread:

[..."0123456789"]

如果您需要更多数字(更多位数),那么我会选择Array.from,使用它的回调参数,并与String 进行映射:

Array.from({length: 20}, (_, i) => String(i+1));

如果您将执行此操作数百万次,那么没有什么能比原来的硬编码数组字面量更好。但对于其他“正常”用途,这是完全可以接受的。

【讨论】:

  • 这种在 10 点休息,但如果 0-9 是唯一的要求,它还不错。
  • OP 写了“数字数组”,标题说“所有数字字符串”,所以我不明白这意味着多位数字数组。无论如何,我添加了用于多位数字的解决方案。
  • 这是典型的答案...
【解决方案4】:

试试:

console.log(Array(20).fill().map((_, i) =&gt; String(i + 1)));

【讨论】:

    猜你喜欢
    • 2019-01-16
    • 2020-07-12
    • 2021-03-18
    • 2021-05-29
    • 2013-02-27
    • 2020-06-26
    • 2020-09-23
    • 2022-01-22
    • 2023-03-03
    相关资源
    最近更新 更多