2017-04-06 1 views
3

私の目標は、マトリックスの各要素に動的に選択された変換のセットを効率的に適用することです。私は選択された関数を配列に格納してから、行列のそれぞれを1回のパスで適用します。JavaScriptで、動的に作成された関数名を適用する方法

私の質問は、関数の配列に追加する関数の名前をどのように動的に作成できますか?

このfiddleには私の試みが含まれています。私の質問はコメントブロックに含まれています。

function dynam() { 

    var prepend = 'before - '; 
    var append = ' - after'; 
    var whichCase = 'Upper'; 

    var functionsToApply = []; 
    var matrix = [ 
        ['aBc', 'DeF'], 
        ['ghi', 'JKL'], 
       ]; 

    var out = 'Initial: ' + matrix.join(' | '); 
    document.getElementById('output').innerHTML = out + '\n'; 
    console.log(out); 

    // Set up transforms 
    if (whichCase == 'Lower') { 
    functionsToApply.push(function(v) {return v.toLowerCase();}); 
    } else if (whichCase == 'Upper'){ 
    functionsToApply.push(function(v) {return v.toUpperCase();}); 
    } 

// How can the function be defined dynamically? 
// Perhaps something like: 
// if(['Lower','Upper'].indexOf(whichCase) != -1) { 
// functionsToApply.push(function(v) {'return v.to' + which + 'Case();'}); 
// } 

    if (prepend && prepend.length > 0 && prepend != 'none') { 
    functionsToApply.push(function(v) {return prepend + v;}); 
    } 
    if (append && append.length > 0 && append != 'none') { 
    functionsToApply.push(function(v) {return v + append;}); 
    } 

// Apply all of the transforms to each of the elements of the matrix 
    matrix = matrix.map(function(row){ 
    return row.map(function(val) { 
     for (var fn = 0; fn < functionsToApply.length; fn++) { 
     val = functionsToApply[fn](val); 
     } 
     return val; 
    }) 
    }); 

    out = 'Final: ' + matrix.join(' | '); 
    document.getElementById('output').innerHTML += out + '\n'; 
    console.log(out); 
} 

答えて

2

私は、あなたはハッシュへの鍵となるで渡された値に基づいて、それらを呼び出すことができ、この場合はハッシュで私の関数を宣言したいです。

更新:下位/上位関数を動的に取得して呼び出す方法を追加しました。

function dynam(whichCase, prepend, append, matrix) { 
 

 
var functionHash = { 
 
    "Lower" : function(v) {return v.toLowerCase();}, 
 
    "Upper" : function(v) {return v.toUpperCase();}, 
 
    "Prepend" : function(v) {return prepend + v;}, 
 
    "Append": function(v) {return v + append;} 
 
} 
 

 
// to actually get the case function based on the word passed in, 
 
// you can do it this way. 
 

 
var lowerUpperFunction = String.prototype['to' + whichCase + 'Case']; 
 
var str = lowerUpperFunction.call("xyz"); 
 
console.log(str); 
 

 
    var functionsToApply = []; 
 
    
 
    var out = 'Initial: ' + matrix.join(' | '); 
 
    console.log(out); 
 
    
 
// see how we just take the whichCase and make that a call to the hash? 
 
functionsToApply.push(functionHash[whichCase]); 
 

 
if (prepend && prepend.length > 0 && prepend != 'none') { 
 
    functionsToApply.push(functionHash["Prepend"]); 
 
    } 
 

 
if (append && append.length > 0 && append != 'none') { 
 
    functionsToApply.push(functionHash["Append"]); 
 
} 
 

 
// Apply all of the transforms to each of the elements of the matrix 
 
    matrix = matrix.map(function(row){ 
 
    return row.map(function(val) { 
 
     for (var fn = 0; fn < functionsToApply.length; fn++) { 
 
     console.log("applying function to val" + val); 
 
     val = functionsToApply[fn](val); 
 
     } 
 
     return val; 
 
    }) 
 
    }); 
 

 
    out = 'Final: ' + matrix.join(' | '); 
 
    return out; 
 
} 
 

 

 
    var p = 'before - '; 
 
    var a = ' - after'; 
 
    var w = 'Upper'; 
 
    var m = [ 
 
      ['aBc', 'DeF'], 
 
      ['ghi', 'JKL'], 
 
     ]; 
 
    
 
console.log(dynam(w, p, a, m));

+0

ありがとうございます。私はこのソリューションの有効性を高く評価していますが、実際に関数名を作成するためにテキスト連結を使用する方法があるかどうかは疑問です。 –

+0

あなたが望むものを追加しました。基本的に、このようにString.prototypeに名前を連結します:var lowerUpperFunction = String.prototype ['to' + whichCase + 'Case'];これを次のように呼び出します。 var str = lowerUpperFunction.call( "xyz"); – nixkuroi

+0

ありがとう、nixkuroi。それは私が試していたもののように見えます。今は遅れているので、明日はそれを試してみます。私はあなたの助けに感謝します! –

関連する問題