2017-01-13 10 views
0

関数をソートして呼び出す関数を作成したいと思います。問題は、各関数が異なる数の引数を持つ可能性があり、ソートの前にこれらの引数を渡す必要があることです。たとえば:javacriptで関数の配列を並べ替える

function sortFunciton(arrayOfFunctions) { 

} 

mySortedFunction = sortFunction([function1('a', 'b'), function2('a'), function3('a','b','c')]) 

の問題は、私はこのような配列を渡す場合は、ので、私はすでに関数の値を渡すことになりますが、私は、これらの機能は、ソート前に実行されないようにするということです彼らは計算が重いので、実行する必要があるのは1つだけなので、私はソートしています。

mySortedFunction = sortFunction([function1.args('a', 'b', 'c')], function2.args('a'), function3.args('a', 'b', 'c')]) 

してから行う

mysortedFunction.callWithArgs() 

は次のように渡す方法はありませんか?

+1

'function.prototype.bind'が役に立ちます –

+0

関数を比較することはできません。どのようにソートするのか分かりません。あなたは「*ただ一つは実行されなければならないので、私は*を並べ替えるのです」ということを正確にはどういう意味ですか? – Bergi

答えて

1

あなたはFunction.prototype.bindを使用して、特定のバウンドの引数を持つuninvoked関数参照を渡すことができます。

function selectFunc(funcArray) { 
    //some selection criteria 
    return funcArray[0]; 
} 

mySelectedFunc = selectFunc([function1.bind(null, 'a', 'b'), function2.bind(null, 'a'), function3.bind(null, 'a','b','c')]); 

mySelectedFunc() //equivalent of running function1('a', 'b') 
+0

次に、mySortedFunction()を呼び出します。 – Gatonito

+0

このパターンに従うと、関数の配列ではなく、関数の配列を返すことができます。 'sortFunction'は何をするべきですか? – hackerrdave

+0

これらの引数で呼び出されるこれらの関数の1つを選択する必要があります。 – Gatonito

0

あなただけの(それがバインドされたパラメータと呼ばれます)引数なしで、あなたの関数を呼び出す、その後.bindを使用することができます

function add(a, b) { return a + b; } 
 
function mult(a, b) { return a * b; } 
 
var functions = [add.bind(this, 1, 1), mult.bind(this, 5, 5)]; 
 

 
functions.forEach(f => console.log(f()));

0
function sortFunciton(arrayOfFunctions) { 

} 

var mySortedFunction = sortFunction([ 
    { func: function1, arguments: ['a', 'b']}, 
    { func: function2, arguments: ['a']}, 
    { func: function3, arguments: ['a', 'b', 'c']} 
]); 

for (var i = 0; i < mySortedFunction.length; i++) 
{ 
    mySortedFunction[i].func.apply(this, mySortedFunction[i].arguments); 
};