>백엔드 개발 >PHP 튜토리얼 >javascript - 변수 내용에 따라 해당 기능을 실행하는 방법은 무엇입니까?

javascript - 변수 내용에 따라 해당 기능을 실행하는 방법은 무엇입니까?

WBOY
WBOY원래의
2016-12-01 01:27:501367검색

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>

str을 기반으로 케이스를 만들고 다른 fun_XXX()로 점프하는 스위치를 작성할 수 있다는 것을 알고 있지만 이는 유연하지 않습니다. 저의 궁극적인 목표는 함수 이름이 다른 배열을 순서대로 작성하는 것입니다. 호출 시 x를 입력하고 배열의 첫 번째 요소에 해당하는 함수를 마지막 함수까지 실행하고 최종 결과 y를 출력합니다.

다른 축약형은 없나요? 아니면 자유로운 조합을 달성할 수 있습니까? 예를 들어 funstr='abc'와 같은 변수를 기반으로 동일한 이름을 가진 함수를 직접 실행하고 funstr(x)와 같은 것을 실행하면 함수 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>

str을 기반으로 케이스를 만들고 다른 fun_XXX()로 점프하는 스위치를 작성할 수 있다는 것을 알고 있지만 이는 유연하지 않습니다. 저의 궁극적인 목표는 함수 이름이 다른 배열을 순서대로 작성하는 것입니다. 호출 시 x를 입력하고 배열의 첫 번째 요소에 해당하는 함수를 마지막 함수까지 실행하고 최종 결과 y를 출력합니다.

다른 축약형은 없나요? 아니면 자유로운 조합을 달성할 수 있습니까? 예를 들어 funstr='abc'와 같은 변수를 기반으로 동일한 이름을 가진 함수를 직접 실행하고 funstr(x)와 같은 것을 실행하면 함수 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>

예를 들어 유사한 아이디어를 자유롭게 사용할 수 있습니다

@토마토를 싫어하는 물고기 기준으로 개선

  • run 함수를 호출할 때마다 4개의 함수와 하나의 맵이 생성되어야 하는데, 이는 상당히 비용이 많이 듭니다. run 밖에 가지고 다닐 수 있습니다.

  • reduceforEach

  • 으로 교체
<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>

가장 간단한 평가
성가신 {'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>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.