以下函数将始终返回true,因为return false;
返回传递给forEach
的函数。
function exampleFunction(array){
array.forEach(function(element){
if(element.condition){
return false;
}
});
return true;
}
现在,显然下面有效:
function exampleFunction(array){
var result = true;
array.forEach(function(element){
if(element.condition){
result = false;
}
});
return result;
}
但它并不理想,因为它会进行不必要的迭代。我知道我可以通过使用forEach
的不同循环来解决问题,但我想知道是否有办法保留forEach
。那么,我怎样才能从上面的'返回在嵌套函数中使用JavaScript函数吗?
答案 0 :(得分:2)
除了抛出异常之外,在循环期间无法打破.forEach
循环(但不要这样做)。如果您需要中途休息,请使用for
循环。如果你真的需要方法或功能:
function forEach(arr, func) {
for (var i = 0; i < arr.length; i++) {
if (func(arr[i], i) === false) {
break;
}
}
}
// Or...
Array.prototype.softLoop = function(func) {
for (var i = 0; i < this.length; i++) {
...
}
var my_array = [0, 1, 2, 3];
my_array.softLoop(function(element, index) {
console.log(index, element);
if (element == 2) {
return false;
}
});
你甚至可以修改它,这样你就不需要在循环外面有一个标志:
Array.prototype.softLoopReturnable = function(func) {
for (var ret, i = 0; i < this.length; i++) {
ret = func(arr[i], i);
if (ret === false) {
break;
}
}
return ret;
}
答案 1 :(得分:1)
您可以使用Array.prototype.some
:
function exampleFunction(array){
return !array.some(function(element){
return element.condition;
});
}
在上面的代码中,exampleFunction
会遇到false
element
,其中condition
是真实的,true
如果找不到,则{{1}}会返回{{1}}。
答案 2 :(得分:0)
您可以将function doesNotContainOnes(array){
return !array.some(function(el) { return el === 1; });
}
document.body.innerHTML = doesNotContainOnes([5,9,6]) + '<br>' // true
+ doesNotContainOnes([5,9,6,'hi']) + '<br>' // true
+ doesNotContainOnes([5,9,6,1]) + '<br>'; // false
by throwing an exception短路,但更好的方法是使用Array.prototype.some()
:
{{1}}