我最近发现.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
当谈到迭代时,这两个应该相同的,以不同方式定义的数组会以不同的方式迭代(参见第一个发送)
因此,我的问题,
undefined
。我对么?对这种异常有任何潜在的解释吗?非常欢迎任何帮助。谢谢!
答案 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])
}
map
,every
,forEach
等具有相同的效果。回调不会调用数组中缺少的元素(即,从未设置过的索引,已删除的索引或从未赋值的索引)。
答案 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
允许我们获得键/值对,即使是未定义的元素