Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript:带孔数组上的循环函数_Javascript_Arrays_Ecmascript 6 - Fatal编程技术网

javascript:带孔数组上的循环函数

javascript:带孔数组上的循环函数,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,如果我创建一个稀疏的数组(其中有一些孔),数组函数,如.map(),.reduce(),.forEach()将跳过这些孔 [, , 1, , 2].forEach((item) => console.log(item)) // 1 // 2 我要找的是一个数组函数,它不会跳过漏洞,工作原理如下: [, , 1, , 2].fullForEach((item) => console.log(item)) // undefined // undefined // 1 // undef

如果我创建一个稀疏的
数组
(其中有一些孔),数组函数,如
.map()
.reduce()
.forEach()
将跳过这些孔

[, , 1, , 2].forEach((item) => console.log(item)) 
// 1
// 2
我要找的是一个数组函数,它不会跳过漏洞,工作原理如下:

[, , 1, , 2].fullForEach((item) => console.log(item))
// undefined
// undefined
// 1
// undefined
// 2
我希望在原始数组上循环,而不是将数组中的孔转换为实际的
未定义的
值,也就是说,以下任何一项都不是我想要的:

Array.from([, , 1, , 2]).forEach();
[...[, , 1, , 2]].forEach();
我正在为此寻找一个功能性解决方案,这意味着我希望在
/
循环时为
/
获得一个没有任何
的解决方案。

它会起作用

[,,1,4,,,,1].find((item) => console.log(item));

您不应该使用
Array.prototype.find
进行此操作–
find
将在函数返回truthy值后立即停止迭代。它只会在提供的
console.log
示例中继续迭代,因为
console.log
是一个副作用函数,总是返回
未定义的
,一个非真实值

相反,您应该创建自己的迭代器来正确地描述您实际想要的行为。正如其他人所评论的,使用
for
while
循环没有什么错–这正是像
reduce
map
这样的本机函数的实现方式。你想要的是创建一个功能接口——也就是说,你的功能在内部看起来是什么并不重要;函数的用户可以用纯函数的方式使用它

Array.prototype.fullForEach=函数(f,env){
for(设i=0;i[…acc,f.call(env,x,i,this)],[],env)
}
常数arr=[,,,2,,]
arr.fullForEach((x,i,xs)=>console.log(x,i,xs))
//未定义的0[,2,]
//未定义的1[,2,]
//未定义的2[,2,]
// 2 3 [ , , 2,  ]
//未定义的4[,2,]
log(arr.fullMap(x=>x?x:'void'))
//['void','void','void',2','void']
log(arr.fullMap(函数(x){returnx?x:this.default},{default:'void'}))
//['void','void','void',2','void']
控制台日志(arr.fullReduce((acc,x)=>x?acc+x:acc+'-','')
// ---2-
log(arr.fullReduce(函数(acc,x){return x?acc+x:acc+this.default},,{default:'-'}))

//---2-
为什么是否决票?您要找的术语是处理“稀疏”数组,为什么是
数组。从
不可接受?@Emissary,因为这会将数组孔转换为我希望避免的实际值。map、reduce和forEach都用于内部的/while循环。由于它们忽略空数组元素,您可能需要编写自己的函数,该函数使用for/while循环。查看polyfill地图:@Danmoreng,我不知道他们在使用for/while循环。我在哪里可以读到更多关于它们如何在内部工作的信息?谢谢!很高兴知道
find
在索引上迭代,而不是在元素上迭代:)我仍然想知道为什么这与其他数组函数的工作方式不同:-/
array.prototype.find
不适用于此。请参阅我的答案以获得更多解释。