2016-04-26 116 views
0

下面的函数将始终返回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中的'above'函数返回?

回答

0

可以短路forEachby throwing an exception,但更好的方法是使用​​:

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

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

这应该是接受的解决方案 – Viliami

1

你可以使用Array.prototype.some

function exampleFunction(array){ 
    return !array.some(function(element){ 
    return element.condition; 
    }); 
} 

在上面的代码中,exampleFunction将返回false,当它遇到第一个element其中condition是真的或01如果没有找到,则为。