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);
}
ありがとうございます。私はこのソリューションの有効性を高く評価していますが、実際に関数名を作成するためにテキスト連結を使用する方法があるかどうかは疑問です。 –
あなたが望むものを追加しました。基本的に、このようにString.prototypeに名前を連結します:var lowerUpperFunction = String.prototype ['to' + whichCase + 'Case'];これを次のように呼び出します。 var str = lowerUpperFunction.call( "xyz"); – nixkuroi
ありがとう、nixkuroi。それは私が試していたもののように見えます。今は遅れているので、明日はそれを試してみます。私はあなたの助けに感謝します! –