【问题标题】:Mapping Over a new Array() without populating it returns an empty array. Why? [duplicate]映射一个新的 Array() 而不填充它会返回一个空数组。为什么? [复制]
【发布时间】:2017-11-15 21:37:47
【问题描述】:

这个谜题。

假设您新建了一个包含 1,000 个元素的数组,并希望使用 .map() 将每个元素的索引指定为元素的值。我希望它能够像这样工作:

new Array(1000).map((element, i) => i);

问题出在:尽管将 .map() 的返回值指定为数组索引,但返回的新数组虽然具有所需的 1,000 个元素,但却是空的。这可以通过链接.fill(0) 来解决,如下所示:

new Array(1000).fill(0).map((element, i) => i);

但是为什么呢?

为什么.map.filter 需要填充数组来生成填充数组?

【问题讨论】:

  • Jared Smith,是否有机会将已接受答案的文章重新命名为更能描述问题内容的内容?我认为我的标题比“怪异”更适合搜索。
  • 你想要它是什么?
  • 欢迎您批发我的头衔。我花了很长时间寻找这个问题的答案(因此是这个问题)。

标签: javascript arrays ecmascript-6


【解决方案1】:

要使其正常工作,您可以使用 ECMA6 中的扩展运算符

console.log([...new Array(1000)].map((element, i) => i))

【讨论】:

  • ...但为此最好使用Array.from({length: 1000}, (element, i) => i)
  • 是的,我的例子是学术性的。不过这些例子很棒。
【解决方案2】:

这主要是因为数组必须被填充,即使是未定义的指针才能被迭代。 new Array() 不是。

来自MDC(强调我的):“map 按顺序为数组中的每个元素调用一次提供的回调函数,并根据结果构造一个新数组。回调仅针对数组的索引调用已赋值;对于已删除或从未赋值的索引不会调用它。"

根据该线程已接受答案的第一条评论:

JavaScript "new Array(n)" and "Array.prototype.map" weirdness

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多