【问题标题】:Iterate over Array with empty elements (ES6)使用空元素迭代 Array (ES6)
【发布时间】:2016-07-02 16:47:33
【问题描述】:

我有一个指定长度的数组,我试图用依赖于每个索引的值填充它。

let arr = new Array(someLength)
arr.map((v, i) => i * 2)

据我所知,这不起作用,因为 map 跳过 未定义的值。

我有几个问题:

  1. 为什么map 可以处理[undefined, undefined] 之类的东西?
  2. 有没有办法使用 ES6 数组方法来实现这一点?

    我知道我可以使用标准的 for 循环,但想知道是否有 更好的 方法来做到这一点。

    for (let i = 0; i < arr.length; i++) { 
       arr[i] = i * 2 
    }
    

    到目前为止,我找到了一种方法,但它并不是很干净。

    arr = arr.fill(undefined).map((foo, i) => i * 2)
    

【问题讨论】:

标签: javascript arrays ecmascript-6 undefined


【解决方案1】:
  1. 为什么.map 可以处理[undefined, undefined] 之类的东西?

考虑这两种情况

let a1 = [];
a1.length = 2;
a1; // [undefined × 2]

// vs

let a2 = [undefined, undefined];
a2; // [undefined, undefined]

Object.keys 对每一个的结果是什么?

Object.keys(a1); // []
Object.keys(a2); // ["0", "1"]

所以,我们可以看到两者之间的区别 - 一个具有初始化键,另一个没有


  1. 有没有办法使用 ES6 数组方法来实现这一点?

你已经指出.fill,你也可以使用Array.from

Array.from({length: 5}, (itm, idx) => 2 * idx); // [0, 2, 4, 6, 8]

【讨论】:

  • 我认为您应该更改最后一条语句以使用原始array
【解决方案2】:

您可以生成一个包含undefined 值的数组。

Array.apply(null, {length: 5})

并将其用于映射。

var array = Array.apply(null, {length: 5});
console.log(array);

array = array.map((_, i) => 2 * i);
console.log(array);

【讨论】:

  • 如果您将var array = Array.apply(... 更改为var array = []; array.length = 5;,那么您会发现它不起作用。
  • @mortezaT,对。但我使用上面没有稀疏元素。
【解决方案3】:

您只需用 0 填充数组。然后您可以像这样使用 map 或 forEach 进行处理:

var arr = new Array(5); //[,,,,,]
arr.fill(0).forEach((v, i, tab) => {tab[i] = i * 2}); // [ 0, 2, 4, 6, 8 ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2018-08-02
    相关资源
    最近更新 更多