2017-04-06 92 views
3

我的目标是有效地将一组动态选择的变换应用于矩阵的每个元素。我将选定的函数存储在一个数组中,然后通过矩阵将它们中的每一个应用于一次。在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。这看起来像我想要的。现在已经晚了,所以明天我会玩。我感谢您的帮助! –