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

return statement in forEach won't stop execution of function

本文关键字:函数 执行 中的 return 语句 forEach      更新时间:2023-09-26

我试图确定数组是否包含某个项目。如果有,我希望保留这个函数,否则它应该被添加。

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

不幸的是,即使满足if条件,数据也会被推送。如何在不使用else条件的情况下防止这种行为?

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

编辑:

forEach是否异步执行?

老方法有时是最好的。这是因为你在调用.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);
});

此方法也支持较旧的浏览器,不像some, everyforEach

除了抛出异常(@Yoshi)之外,您不能停止forEach的执行。不应将其视为影响程序代码流的选项(@Me)。

你能做的是使用另一个方法someevery

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

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

老问题,但万一有人遇到这个问题。

如果你正在使用ECMAScript 6,你可以使用Array find()方法

var found = myArray.find(function (element) { return element === arrayToFind; });

所以对于这个特殊的场景将是:

function addPacking(item){
    var foundItem = data.find(function(entry){ return entry.name == item.name});
    if (foundItem) data.packings.push(foundItem);    
}

参见http://www.w3schools.com/jsref/jsref_find.asp查看另一个工作示例。

Return只是中止forEach中调用的函数,而不是您的addPackings函数。

function addPacking(item){
    var isInPackings = false;
    data.packings.forEach(function(entry){
       if(item.name == entry.name){
           isInPackings = true;
       }
    });
    if (!isInPackings)
        data.packings.push(item);
}

你只是从子函数返回而不是从父函数返回

function addPacking(item){
    var check=false;
    data.packings.forEach(function(entry){
       if(item.name == entry.name){
          check=true; 
          return;
       }
    });
     if (check) return;
    data.packings.push(item);
}