首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >中断数组循环函数(map、forEach等)的循环

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

Stack Overflow用户
提问于 2018-05-28 10:04:18
回答 4查看 6.2K关注 0票数 0

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

Array.prototype.forEach等函数隐含了对数组元素的循环。我想有条件地提前中断这个循环。

这是一个人为的例子:

代码语言:javascript
复制
const colours = ["red", "orange", "yellow", "green", "blue", "violet"];

colours.map(item => {
    if (item.startsWith("y")) {
        console.log("The yessiest colour!");
        break;
    }
});

导致SyntaxError: Illegal break statement

如何像break语句一样中断循环?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-05-28 11:32:48

Array#mapArray#forEach等从来都不是被设计成可以停止的。这感觉很奇怪,因为map的意图也是forEach实际上是迭代所有项。

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

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

代码语言:javascript
复制
Object.defineProperty(Array.prototype, 'untilTrue', {
    enumerable: false,
    value: function(lambda) { 
    	for(let i in this) {
      	if(lambda.call(this, this[i])) return;
      }
    }
});

const colours = ["red", "orange", "yellow", "green", "blue", "violet"];

colours.untilTrue(item => {
    if (item.startsWith("y")) {
        console.log("The yessiest colour!");
        return true;
    }
    console.log(item);
});

将此自定义untilTrueArray#find的使用进行比较

代码语言:javascript
复制
const colours = ["red", "orange", "yellow", "green", "blue", "violet"];

colours.find(item => {
    if (item.startsWith("y")) {
        console.log("The yessiest colour!");
        return true;
    }
    return false;
});

唯一值得注意的区别是untilTrue不返回匹配项-除了调用lambda之外,Array#find还会返回匹配项。

因此,通常我会坚持使用Array#find来保持代码的整洁,并像这样使用它:

代码语言:javascript
复制
const colours = ["red", "orange", "yellow", "green", "blue", "violet"];

if(colours.find(item => item.startsWith("y")) !== undefined) {
  console.log("The yessiest colour!");
}

这会在第一次匹配时停止循环(并返回匹配的元素)。另请注意,您必须与undefined进行比较-如果您正在搜索falsenull值,如果只是与true进行比较,则检查永远不会评估为true

票数 1
EN

Stack Overflow用户

发布于 2018-05-28 10:45:24

你不能用常规的方法来做这件事。您可以通过记住循环是否“中断”来模拟break行为。缺少这种解决方案的是循环实际上继续(尽管跳过了迭代逻辑)。

代码语言:javascript
复制
let isBroken = false;

colours.map(item => {
    if (isBroken) {
        return;
    }
    if (item.startsWith("y")) {
        console.log("The yessiest colour!");
        isBroken = true;
        return;
    }
});

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

代码语言:javascript
复制
for (colour of colours) {
    if (colour.startsWith("y")) {
        console.log("The yessiest colour!");
        break;
    }
}

此外,您还可以使用一种肮脏的方式来实际停止map循环。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2018-05-28 11:08:02

如果您唯一的选择是使用Array.forEach,则可以抛出异常

请参阅以下内容:

How to short circuit Array.forEach like calling break?

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

示例可以在这里参考:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50558227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档