2016-05-27 14 views
1

私は関数参照の配列を持っています。最初の関数呼び出しの戻り値を2回呼び出さずに取得

私の一致条件を満たす最初の関数呼び出しの戻り値を見つける必要があります。

マッチした関数を2回呼び出すことを避けるにはどうすればよいですか?

var f = function(x) { if (x === 10) return "ten"; } 
var g = function(y) { if (y === 20) return "twenty"; } 

var result = [f, g].find(m => m(10)) 
if (result) return result(10) 
// this returns "ten" 
+0

コンテキストを教えてください。 10は何ですか?配列はどこですか? – 4castle

+0

@ 4castle \t配列は関数参照の配列です。 '10'は数字です。 –

+0

したがって、m(10)が真を返す関数を見つけようとしていますか? – IMTheNachoMan

答えて

1
まだ

ない私は完全にあなたが質問を理解してください。条件の中で呼び出された関数が真実であれば、一連の関数を反復して結果を返すことができます。

let fncaller = (fns, condition) => { 
    var result 
    for (var fn of fns) { 
    result = fn(condition) 
    if (result) { return result } 
    } 
} 
+0

しかし、ホイールを再発明する必要はありません。私の答えを見てください。 – 4castle

1

グローバル変数を使用できますか?

var f = function(x) { 
 
    return x % 2 == 0 
 
} 
 
var g = function(y) { 
 
    return x % 2 == 1 
 
} 
 

 
var result = [f, g].find(function(m) { 
 
    window.blah = m(10); 
 
    return window.blah; 
 
}) 
 
console.log(window.blah);

それともDaveNewtonの方法@。速くなるかわからない:あなたが行くように

var f = function(x) { 
 
    if (x === 10) return "ten"; 
 
} 
 
var g = function(y) { 
 
    if (y === 20) return "twenty"; 
 
} 
 

 
var funcs = [f, g]; 
 

 
function checkIt(value) { 
 
    for (var i = 0, numFuncs = funcs.length; i < numFuncs; ++i) { 
 
    var v = funcs[i](value); 
 
    if (v) return v; 
 
    } 
 
} 
 

 
console.log(checkIt(20));

+1

早期復帰を伴う標準的な反復処理のように思えますが、最も効率的です。 –

+0

うん。どちらも基本的に配列をループするので、私が想定している同様の効果です。パフォーマンスについては不明です。チェックできません。 – IMTheNachoMan

+0

'find'は* all *関数を反復処理します。早期復帰を伴う単純な反復を使用することはできません。高速機能や短いリストの場合は問題ありませんが、長期実行機能の場合は重要です。 –

0

あなたは、変数に格納できます。これは、グローバルを使用するよりも優れています。

var f = function(x) { if (x === 10) return "ten"; }; 
 
var g = function(y) { if (y === 20) return "twenty"; }; 
 

 
function findValue(funcs, val) { 
 
    var result; 
 
    funcs.find(m => result = m(val)); 
 
    return result; 
 
} 
 

 
console.log(findValue([f, g], 10));

+0

これは...グローバルです。 –

+0

@Dave OPはreturn文を使用していたので、実際には関数スコープです。 – 4castle

+0

あなたのコードはグローバルを使用しています。 –

関連する問題