Javascript forEach-won'中的返回语句;t停止函数的执行

Javascript forEach-won'中的返回语句;t停止函数的执行,javascript,Javascript,我试图确定数组是否包含某个项目。如果有,我想保留该函数,否则应该添加它 function addPacking(item){ data.packings.forEach(function(entry){ if(item.name == entry.name){ return; } }); data.packings.push(item); } 不幸的是,即使满足if条件,也会推送数据。如何在不使用else条件的情况

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

function addPacking(item){

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

    data.packings.push(item);

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

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

编辑:


forEach是否异步执行?

您只是从子函数返回,而不是从父函数返回

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);

}

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);

}
除了抛出异常(@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);
    }
}


老办法有时是最好的。这是因为调用
.forEach
时传递的是委托函数。委托中的
返回值
正在丢失,并且不适用于任何内容。要获得所需的结果,您需要退出调用函数
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);
});
功能添加包装(项目){
对于(变量i=0;i

这种方法也支持较旧的浏览器,不像以前的问题,但以防其他人遇到这个问题

如果您使用的是ECMAScript 6,则可以使用Array find()方法

因此,对于这种特殊情况,应:

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

请参阅以获取另一个工作示例。

@epipav:forEach
方法是一种方法,与forEach结构不同。@epipav Wat?!“注意:无法停止或中断forEach循环。解决方案是使用Array.every或Array.some。请参见下面的示例。”使用
every
some
将有效,但是使用
&
操作符的副作用而不是
if
语句使其可读性不高。迂腐:你不能停止forEach不是真的。@Yoshi我怀疑迂腐的程序员应该考虑抛出异常。:)它可以工作,但数组也可能包含未定义的内容(当然,这对于OP案例来说可能不是问题)。这是正确的Adriano,我只是基于提供的条件。:)我发现这是最方便的选择,谢谢你和所有其他人提供这么多不同的方法和解释!成功了。谢谢:)。我们也可以尝试这种方式**函数addPacking(item){for(let record of data.packings){if(item.name==record.name){return;}}data.packings.push(item);})**这将起作用,但即使找到匹配项,它仍将循环所有项,循环中的
返回
是没有意义的。
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);    
}