2016-04-26 90 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如果沒有找到,則爲。