Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.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 中断数组循环函数(map、forEach等)的循环_Javascript_Control Structure - Fatal编程技术网

Javascript 中断数组循环函数(map、forEach等)的循环

Javascript 中断数组循环函数(map、forEach等)的循环,javascript,control-structure,Javascript,Control Structure,如何从数组上的隐式循环中断(类似于break语句) Array.prototype.map,Array.prototype.forEach等函数意味着数组元素上的循环。我想有条件地尽早打破这种循环 这个人为的例子: const colors=[“红”、“橙”、“黄”、“绿”、“蓝”、“紫”]; 颜色。地图(项目=>{ 如果(项目以“y”开头){ 原木(“最漂亮的颜色!”); 打破 } }); 导致语法错误:非法中断语句 我怎样才能像break语句那样中断循环呢?尽管forEach被设计为运行一

如何从数组上的隐式循环中断(类似于
break
语句)

Array.prototype.map
Array.prototype.forEach
等函数意味着数组元素上的循环。我想有条件地尽早打破这种循环

这个人为的例子:

const colors=[“红”、“橙”、“黄”、“绿”、“蓝”、“紫”];
颜色。地图(项目=>{
如果(项目以“y”开头){
原木(“最漂亮的颜色!”);
打破
}
});
导致语法错误:非法中断语句


我怎样才能像
break
语句那样中断循环呢?

尽管
forEach
被设计为运行一些不会改变数组的函数(即,它被设计为对每个项执行其他副作用),但它被明确地记录为无法中断循环

从:

除了抛出异常之外,无法停止或中断
forEach()
循环。如果需要这种行为,那么
forEach()
方法是错误的工具

因此,尽管forEach设计用于副作用,但无法正常访问环路的控制结构

由于
Array.prototype.map
Array.prototype.reduce
旨在生成一个新的值,因此它们不是为提前中断等副作用而设计的。文档似乎没有明确说明这一点


可能的替代方法:重新编写代码以使用或。这些都被明确地记录下来,以便在已知条件时提前终止循环(当
某些
将返回
true
,或者当
每个
将返回
false


你不能用常规的方法来做。通过记住循环是否“断开”,可以模拟
break
行为。这种解决方案的不足之处在于循环实际上在继续(尽管迭代逻辑被跳过)

对于您的示例,最好的解决方案是使用普通的
for
循环

for (colour of colours) {
    if (colour.startsWith("y")) {
        console.log("The yessiest colour!");
        break;
    }
}
colours.map((item, index, array) => {
    if (item.startsWith("y")) {
        console.log("The yessiest colour!");
        array.splice(0, index);
    }
});
// The colours array will be modified after this loop
此外,您还可以使用脏方法实际停止
map
循环

for (colour of colours) {
    if (colour.startsWith("y")) {
        console.log("The yessiest colour!");
        break;
    }
}
colours.map((item, index, array) => {
    if (item.startsWith("y")) {
        console.log("The yessiest colour!");
        array.splice(0, index);
    }
});
// The colours array will be modified after this loop

如果您的唯一选项是使用Array.forEach,则可以引发异常

请参阅:

还有其他方法可以解决你的问题。例如,如果要检查某个条件并基于该条件中断循环,可以使用方法:Array.prototype.some()

示例可在此处引用:

阵列#映射,
阵列#forEach
等从未被设计为停止。这会让人感到奇怪,因为
map
以及
forEach
的目的实际上是迭代所有项目

另外,我认为不可能通知调用者发生了
中断
事件,因为它位于一个不是原始循环不可分割的部分的函数中

让我们来看一个自定义方法,它在第一次出现
true
时停止循环,而不返回匹配值本身:

Object.defineProperty(Array.prototype,'untltrue'{
可枚举:false,
值:函数(λ){
为了(让我进来){
如果(lambda.call(this,this[i])返回;
}
}
});
常量颜色=[“红”、“橙”、“黄”、“绿”、“蓝”、“紫”];
颜色。不真实(项目=>{
如果(项目以“y”开头){
原木(“最漂亮的颜色!”);
返回true;
}
控制台日志(项目);

});
Array#map
不是为具有副作用的迭代而设计的(不得用于该目的),它不能停止<代码>数组#forEach
也无法停止。如果您需要查找某些内容,则需要使用
Array#indexOf
Array#find
或任何其他查找方法。您不能破坏地图。您必须使用可停止的方法,例如
for
while
,或者,正如@zerkms所建议的,您可以在不迭代的情况下搜索您的项目。您不能这样做,因为这些方法不允许它。但是,如果你真的需要这个功能,你应该使用一个带计数器的
for
循环。你所说的“
forEach
设计用于副作用”到底是什么意思?不知道为什么会被否决。这是正确的,它很好地解释了原因。@Scott,基本上是因为这个问题是在没有研究的情况下提出的,当OP最终进行研究时,他们决定用他们在提问之前应该阅读的内容回答他们自己的问题。@AndreiGheorghiu,回答自己的问题是使用StackExchange站点的有效方式。我有这个问题,我想在找到答案后记录下来。我个人不会。在StackOverflow上复制MDN内容不会让我大吃一惊。这是关于这个问题的。顺便说一下,您链接的不是“forEach的文档”。是