2016-04-26 9 views
0

return false;は、渡された関数をforEachに戻すため、以下の関数は常にtrueを返します。明らかに今上記の入れ子関数から戻る方法は?

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は、最初にelementになると、falseを返します。conditionはtrueまたは01です見つからない場合はです。