javascript - 如何根據變數內容運行對應函數?

WBOY
發布: 2023-03-02 13:40:02
原創
1321 人瀏覽過

我寫了幾個函數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}

思路很簡單,phpnode 我都貼個範例程式碼吧

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>
登入後複製
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!