2017-01-20 12 views
1

配列の各値をexpensiveOperation関数に対して実行し、いくつかの基準を満たす最初のコードを返します。見つかった要素以外のものを返すJS配列find()

let result = [1, 2, 3, 4, 5].find(value => { 
    let newValue = expensiveOperation(value) 
    return meetsCritera(newValue) 
} 
result = expensiveOperation(result) 

しかしはfind関数から返される(例えば3)、むしろexpensiveOperation(3)の結果より配列値です。その最終的な価値を得るために、私はfindの体の外にもう一度expensiveOperationを実行する必要があります。

これをもう一度実行し、希望の値をfindから戻すことはできません。これを可能にする別のES6配列関数がありますか?

+0

ない値 – Roljhon

+1

が関数の外側のスコープを持つ変数に値を代入.... –

答えて

1

Array#someを使用して、条件が満たされていればループを終了できます。

var expensiveOperation = a => 3 * a, 
 
    meetsCritera = v => v > 10, 
 
    result = (() => { 
 
     var newValue; 
 
     return [1, 2, 3, 4, 5].some(value => { 
 
      newValue = expensiveOperation(value); 
 
      return meetsCritera(newValue); 
 
     }) && newValue; 
 
    })(); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

'.some()'のコールバックで変数スコープが必要です。そうでなければ、値が 'meetsCriteria() 'を決して通過しない場合でも、' newValue'は 'expensiveOperation'の最後の結果になります –

+0

@squint、editを参照してください。 –

+0

申し訳ありませんが、フロー制御の '&&'が私を捨てました。代わりに「偽」だったので、私は間違っていました。 IMO、フロー制御としての論理演算子は明確なコードを作成しません。 –

1

これは.reduceのためのまともなユースケースです。

let result = [1, 2, 3, 4, 5].reduce((result, value) => { 
    if (result) return result; 

    let newValue = expensiveOperation(value) 
    if (meetsCritera(newValue)) return newValue; 
}, null); 
+3

早めに還元を終了することはできません。 –

+0

@ NinaScholz質問は早い段階で終了することを決して聞かなかったので、 'meetsCritera(newValue)=== true 'の後に' expensiveOperation'を実行しないようにしました。これはこれがうまくいきます。 – loganfsmyth

+0

私はOP *が* expensiveOperationという名前でこのことを知っていると思うし、質問すると "もう一度やり直すのはどうですか? – trincot

2

あなたは常に良い古いループを使用することができます:あなたは、ちょうど真または偽の状態を返す

let result; 
for (let value of [1, 2, 3, 4, 5]) { 
    let newValue = expensiveOperation(value); 
    if (meetsCritera(newValue)) { 
    result = newValue; 
    break; 
    } 
} 
関連する問題