我正在尝试确定数组是否包含某个项目。如果是的话,我想保留这个功能,否则它应该被添加。
function addPacking(item){
data.packings.forEach(function(entry){
if(item.name == entry.name){
return;
}
});
data.packings.push(item);
}
不幸的是,即使满足if条件,也会推送数据。如何在不使用else
条件的情况下阻止此行为?
(我不想使用else
,因为我的实际代码比这复杂得多,我希望保持可读性。
修改
forEach
是否异步执行?
答案 0 :(得分:10)
旧方式有时是最好的方式。这是因为您在调用.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);
});
不同
答案 1 :(得分:6)
除了抛出异常(@Yoshi)之外,你不能停止forEach执行。这不应被视为影响程序代码流的选项(@Me)。
您可以使用其他方法some
或every
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);
}
}
答案 2 :(得分:3)
Yo刚刚从子函数返回,而不是从父函数
返回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);
}
答案 3 :(得分:3)
旧问题,但万一其他人遇到这个帖子。
如果您使用 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了解其他工作示例。
答案 4 :(得分:2)
返回只是中止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);
}