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