我寫了幾個函數funA(x)、funB(x)、funC(x)、funD(x)、funE(x)、funF(x),我現在有個需求,根據某個參數str ,實現不同的計算。例如當str='abc' 時,能執行x→funA(x)→funB(x)→funC(x)→y ,當str'ace' 時,能執行x→funA(x)→funC( x)→funE(x)→y 。
<code>function fun_abc(x) { var a = funA(x); var b = funB(a); var c = funC(b); var y = c; return y; }</code>
我知道可以寫一個 switch 根據 str 做 case,跳到不同的 fun_XXX() 中,但這樣不靈活。我最終目的是希望有一個數組,數組中按順序寫著不同的函數名,調用時輸入x,從數組中第一個元素對應的函數一直運行到最後一個函數,輸出最終結果y。
是否有其他方法可以簡寫?或是能做到自由組合,例如直接根據變數執行同名函數,類似 funstr='abc' 時,執行類似 funstr(x) 執行的就是 function abc(x)?
js 或 php 相關語法都可以。
我寫了幾個函數funA(x)、funB(x)、funC(x)、funD(x)、funE(x)、funF(x),我現在有個需求,根據某個參數str ,實現不同的計算。例如當str='abc' 時,能執行x→funA(x)→funB(x)→funC(x)→y ,當str'ace' 時,能執行x→funA(x)→funC( x)→funE(x)→y 。
<code>function fun_abc(x) { var a = funA(x); var b = funB(a); var c = funC(b); var y = c; return y; }</code>
我知道可以寫一個 switch 根據 str 做 case,跳到不同的 fun_XXX() 中,但這樣不靈活。我最終目的是希望有一個數組,數組中按順序寫著不同的函數名,調用時輸入x,從數組中第一個元素對應的函數一直運行到最後一個函數,輸出最終結果y。
是否有其他方法可以簡寫?或是能做到自由組合,例如直接根據變數執行同名函數,類似 funstr='abc' 時,執行類似 funstr(x) 執行的就是 function abc(x)?
js 或 php 相關語法都可以。
我來舉個例子,eval太粗暴了。 。 。大兄弟來看看我這個
<code>function run(str, param) { let handle = { a: a, b: b, c: c, d: d }; return str.split('').reduce((res, name) => handle[name](res), param); function a(x) { return x + '1'; } function b(x) { return x + '2'; } function c(x) { return x + '3'; } function d(x) { return x + '4'; } } run('acb',0); // "0132"</code>
舉個例子,類似思路可以自由發揮
@不愛吃西紅柿的魚 的基礎上改進下
每次call run
函數的時候,都要產生四個函數和一個map,比較費開銷。可以拎到run
外面。
用reduce
代替forEach
<code>const funcTable = { a, b, c, d } function run(str, initialVal) { return str.split('').reduce((result, funcName) => funcTable[funcName](result), initialVal) } // 定义function a, function b...</code>
最簡單,eval
麻煩點{'abc': fabc}
思路很簡單,php
和 node
我都貼個範例程式碼吧
php
版本
<code>function funstr($str,$param){ $len = strlen($str); for($i=0;$i<$len;$i++){ $fun = 'fun'.strtoupper(substr($str,$i,1)); if(function_exists($fun)){ $param = $fun($param); } } return $param; } function funA($x) { return $x+1; } function funB($x) { return $x+2; } echo funstr('ab',0); // 输出3</code>
node
版本
<code>function funstr(str,x) { var len = str.length; for(var i=0; i<len; i++){ var fun = 'fun'+ str.charAt(i).toUpperCase(); x = eval(fun+'('+x+')'); } return x; } function funA(x){ return x+1; } function funB(x){ return x+2; } console.log(funstr('ab',0));//输出3</code>
把該定義的函數都放在一個物件裡,設定好回傳值在去呼叫不就行啦;
var ab={
<code> a:function(x){console.log(x);return 1}, b:function(x){console.log(x);return 2}, c:function(x){console.log(x);return 3}, d:function(x){console.log(x);return 4}, } function run(str,x){//str是定义的顺序,如acb;x是你要传的参数 var b=x; var aa=str.split("") aa.forEach(function(x){ ab[x](b); b=ab[x](b); }) return b }</code>