在数组中迭代未定义的方法

时间:2016-10-28 03:06:52

标签: javascript arrays

我最近发现.map没有迭代由有孔数组创建的未定义,已定义各个索引的数组,但有些不是:

// Holed
var array = [];
array[0] = 1;
array[2] = 3;
array // => [1, undefined, 3];

// Not Holed
var array = [1, undefined, 3];
array // => [1, undefined, 3]; The "same" as Holed

当谈到迭代时,这两个应该相同的,以不同方式定义的数组会以不同的方式迭代(参见第一个发送)

因此,我的问题,

  1. 有没有办法迭代有孔阵列?
  2. 我怀疑这些的确切字节实际上是不同的,这种奇怪的行为是由于JavaScript如何显示未定义的值,而不是undefined。我对么?对这种异常有任何潜在的解释吗?
  3. 非常欢迎任何帮助。谢谢!

5 个答案:

答案 0 :(得分:2)

  

有没有办法迭代有孔阵列?

多数(全部?)内置Array.prototype函数在稀疏数组中跳过漏洞。

这意味着如果要获取缺失索引的undefined值,则需要先将该数组转换为非稀疏数组。

在ES2015的帮助下,您可以使用数组迭代器。最简单的方法是使用数组扩展语法:

[...array]

然后您可以将映射运算符应用于[...array].map(handler)

  

我怀疑它们的确切字节实际上是不同的,这种奇怪的行为是由于JavaScript如何显示未定义的这些值,而不是未定义的。我对么?对这种异常有任何潜在的解释吗?

你是对的,它没有明确保存undefined值。因为JS中的数组实际上是所谓的"内部对象" (或更短 - 只是对象),它们的索引只是这些对象的属性。因此,当您跳过索引时 - 该属性根本没有设置且不存在。

与访问非现有对象属性相同:

var o = {};
o.foo // undefined

答案 1 :(得分:1)

1.如下:

// Holed
var array = [];
array[0] = 1;
array[2] = 3;
array // => [1, undefined, 3];
for(var i=0;i<array.length;i++) {
  console.log(array[i])
}

  1. mapeveryforEach等具有相同的效果。回调
  2.   

    不会调用数组中缺少的元素(即,从未设置过的索引,已删除的索引或从未赋值的索引)。

    Read more

答案 2 :(得分:0)

关于你的第二个问题:

  

我怀疑这些的确切字节实际上是不同的,并且   这种奇怪的行为是由于JavaScript如何显示这些值   未定义,未定义。我对么?有没有   这种异常的根本解释是什么?

这不是JavaScript(即ECMAScript)显示值的方式。我希望你能得到:

array // => [1, undefined, 3];

在Firefox等浏览器的控制台中。对于控制台显示的内容要非常小心,因为它们往往试图提供帮助而不是严格正确。

您创建的数组如下:

var array = [];
array[0]  = 1;
array[2]  = 3;

然后等效的数组文字是:

var array = [1,,3];

这使得中间元素丢失更加明显。此外,内置的 Array.prototype.toString 方法将使用 join ,以便它返回相同的结果:

array.toString() // [1,,3]

所以不,你所看到的不是JavaScript 本身的结果,而是你特定浏览器或实现控制台的结果。

此外,不同的控制台会给出不同的结果,在Safari中我得到:

[1,,3] // [1, 2: 3] (3) = $2

答案 3 :(得分:0)

有一种方法可以使用像forEach()这样的内置方法填充带孔数组。例如,想象一下我想用字符串“bonjour”填充这样一个数组的漏洞:

var input = [];
input[0] = 1;
input[2] = 3;
console.log(input); // [ 1, , 3 ]
input.map((item, index, arr) => {
    if (!arr[index +1] && index < arr.length-1) arr[index+1] = "bonjour";
});
console.log(input); // [ 1, 'bonjour', 3 ]

答案 4 :(得分:0)

我只是偶然发现了这一点,这些答案似乎都不合适。当我使用 for( x of array) 我会得到适当数量的循环,但无法更改元素(未定义且无索引)。

回到谷歌,下一个答案 ref 提供了这个作为解决方案:

for(const [key, value] of array.entries()) {
   console.log(key+" : "+value)
}

在数组上使用 entries 允许我们获得键/值对,即使是未定义的元素