Heim  >  Artikel  >  Backend-Entwicklung  >  javascript - Wie führe ich eine entsprechende Funktion basierend auf dem Inhalt einer Variable aus?

javascript - Wie führe ich eine entsprechende Funktion basierend auf dem Inhalt einer Variable aus?

WBOY
WBOYOriginal
2016-12-01 01:27:501347Durchsuche

Ich habe mehrere Funktionen funA(x), funB(x), funC(x), funD(x), funE(x), funF(x) geschrieben. Jetzt habe ich eine Anforderung, basierend auf einem bestimmten Parameterstr, um verschiedene Berechnungen durchzuführen. Wenn beispielsweise str='abc' ist, kann x→funA(x)→funB(x)→funC(x)→y ausgeführt werden. Wenn str'ace', x→funA(x) ist. →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>

Ich weiß, dass ich einen Schalter schreiben kann, um einen Fall basierend auf str zu erstellen und zu verschiedenen fun_XXX() zu springen, aber das ist nicht flexibel. Mein ultimatives Ziel ist es, ein Array mit verschiedenen Funktionsnamen der Reihe nach zu schreiben. Geben Sie beim Aufruf x ein, führen Sie die Funktion aus, die dem ersten Element im Array entspricht, und geben Sie das Endergebnis y aus.

Gibt es eine andere Möglichkeit, es abzukürzen? Oder kann eine freie Kombination erreicht werden, indem beispielsweise direkt eine Funktion mit demselben Namen basierend auf einer Variablen wie funstr='abc' ausgeführt wird und so etwas wie funstr(x) ausgeführt wird, wird die Funktion abc(x) ausgeführt?

JS- oder PHP-bezogene Syntax ist akzeptabel.

Antwortinhalt:

Ich habe mehrere Funktionen funA(x), funB(x), funC(x), funD(x), funE(x), funF(x) geschrieben. Jetzt habe ich eine Anforderung, basierend auf einem bestimmten Parameterstr, um verschiedene Berechnungen durchzuführen. Wenn beispielsweise str='abc' ist, kann x→funA(x)→funB(x)→funC(x)→y ausgeführt werden. Wenn str'ace', x→funA(x) ist. →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>

Ich weiß, dass ich einen Schalter schreiben kann, um einen Fall basierend auf str zu erstellen und zu verschiedenen fun_XXX() zu springen, aber das ist nicht flexibel. Mein ultimatives Ziel ist es, ein Array mit verschiedenen Funktionsnamen der Reihe nach zu schreiben. Geben Sie beim Aufruf x ein, führen Sie die Funktion aus, die dem ersten Element im Array entspricht, und geben Sie das Endergebnis y aus.

Gibt es eine andere Möglichkeit, es abzukürzen? Oder kann eine freie Kombination erreicht werden, indem beispielsweise direkt eine Funktion mit demselben Namen basierend auf einer Variablen wie funstr='abc' ausgeführt wird und so etwas wie funstr(x) ausgeführt wird, wird die Funktion abc(x) ausgeführt?

JS- oder PHP-bezogene Syntax ist akzeptabel.

Lassen Sie mich ein Beispiel geben: Eval ist zu unhöflich. . . Großer Bruder, komm und sieh mich

<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>

Ähnliche Ideen können beispielsweise frei verwendet werden

Verbessert auf Basis von @Fisch, der keine Tomaten mag

  • Jedes Mal, wenn Sie die Funktion run aufrufen, müssen vier Funktionen und eine Karte generiert werden, was ziemlich teuer ist. Sie können es run nach draußen tragen.

  • Ersetzen Sie reduceforEach

    durch
<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>

Das einfachste, eval
Ärgerlich {'abc': fabc🎜>

Die Idee ist sehr einfach, ich werde einen Beispielcode für

und php node veröffentlichen

Versionphp

<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>

Versionnode

<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>

Fügen Sie alle definierten Funktionen in ein Objekt ein, legen Sie den Rückgabewert fest und rufen Sie ihn auf

var ab={

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn