forEach中的return语句不会停止执行函数

use*_*960 6 javascript

我试图确定数组是否包含某个项目.如果是,我想保留该功能,否则应该添加.

function addPacking(item){

    data.packings.forEach(function(entry){
       if(item.name == entry.name){
           return;
       }
    });

    data.packings.push(item);

}
Run Code Online (Sandbox Code Playgroud)

不幸的是,即使满足if条件,也会推送数据.如何在不使用else条件的情况下阻止此行为?

(我不想使用,else因为我的实际代码比这复杂得多,我想让它保持可读性)

编辑:

是forEach异步执行吗?

Ric*_*ard 11

旧方式有时是最好的.这是因为你在调用时传递了一个委托函数.forEach.在return委托范围内迷路,不应用任何东西.要获得所需的结果,您需要退出调用函数addPacking.这可以使用简单的for循环来完成.

function addPacking(item){
    for (var i = 0; i < data.packings.length++; i++) {
        if (item.name == data.packings[i].name) {
            return;
        }
    }

    data.packings.push(item);
});
Run Code Online (Sandbox Code Playgroud)

这种方法还支持旧的浏览器,不像some,every和forEach


Yur*_*nko 6

你不能停止的forEach不是抛出异常(@Yoshi)等执行.这不应被视为影响程序代码流(@Me)的选项.

你可以做的是使用另一种方法some或every

function addPacking(item){
    var contains = data.packings.every(function(entry){
       return item.name != entry.name;
    });

    if(contains) {
       data.packings.push(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

function addPacking(item){
    var conatins = !data.packings.some(function(entry){
       return item.name == entry.name;
    });

    if(contains) { 
       data.packings.push(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用`every`或`some`会起作用,但使用`&&`运算符而不是`if`语句的副作用并不能使它具有可读性. (2认同)
  • 要迂腐:*你无法阻止每一个*不是真的. (2认同)