代码之家  ›  专栏  ›  技术社区  ›  B''H Bi'ezras -- Boruch Hashem

JavaScript如何调用函数的函数等。。基于阵列?

  •  0
  • B''H Bi'ezras -- Boruch Hashem  · 技术社区  · 6 年前

    我真的不知道该怎么回答这个问题,这就是为什么我在搜索它时遇到了一些麻烦,但我正在尝试,基本上,制作一个修改mongoDB数据的帮助函数,我有一个命令列表,格式如下:

                  var commands = {
                        "find": {
                            "names": {
                                "find":["query"],
                                "toArray":["callback"]
                            }
                        },
                        "sort": {
                            "names": {
                                "find":[],
                                "sort":["query"],
                                "toArray":["callback"]
                              }                          
                        },
                        "limit": {
                            "names": {
                                "find":[],
                                "limit":["number"],
                                "toArray":["callback"]
                              }                          
                        },
                        "deleteOne": {
                            "args":["query","callback"]
                        },
                        "findOne": {
                            "args":["query", "callback"]
                        },
                        "insertOne": {
                            "args":["query", "callback"]
                        },
                        "insertMany": {
                            "args":["array"]
                        },
                        "remove": {
                            "args":["query", "callback"]
                        },
                        "drop": {
                            "args":["callback"]
                        },
                        "updateOne": {
                            "args":["query", "newvalues", "callback"]
                        },
                        "aggregate": {
                            "args": ["query"],
                            "hasCB":"toArray"
                        },
                        "createCollection": {
                            "args":["string", "callback"]
                        }
                    };
    

    然后是这些值的字典: 其思想是基于输入调用特定的mongoDB函数,比如

    Based off of this, I am able to make an array that looks like this:
    
    [["find",[]],["sort",[{"name":-1}]],["toArray",[/*some function reference*/]]],
    

    基于此,我想打电话给:

    something.find().sort({"name":-1}).toArray(callback);
    

    如果我有这样的东西:

    [[“find”,[{“name”:“hi”}]],[“toArray”[/ 一些函数引用 /]]],

    我应该能够产生以下结果: something.find({“name”:“hi”}).toArray(cb);

    都有相同的功能。

    这不完全是一个node.js问题,更像是一个JavaScript问题,它给出了一个格式为

    [[functionName1,arrayOfArguments1],[functionName2,arrayOfArguments2],[functionName3,arrayOfArguments3]]
    

    你怎么称呼 functionName1(...arrayOfArguments1)[functionName2](...arrayOfArguments2)[functionName3](...arrayOfArguments3) ,

    比如说,使用一个循环或一个函数?我怎样才能产生这个结果呢?我现在用一个开关/外壳来做,但这不太理想:

    switch(funcList.length) {
                            case 2:
                                console.log(col[funcList[0][0]](...funcList[0][1])[funcList[1][0]](...funcList[1][1]));
                                break;
                            case 3:
                                console.log(col[funcList[0][0]](...funcList[0][1])[funcList[1][0]](...funcList[1][1])[funcList[2][0]](...funcList[2][1]));
                                break;
                        }
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   Elango Sengottaiyan    6 年前

    只是用表名解析

    var Jstr = JSON.parse(commands).find;
    

    现在,Jstr包含

    "names": {
         "find":["query"],
          "toArray":["callback"]
      }
    

    像这样,您可以解析并获取值。

        2
  •  0
  •   Aakash Verma    6 年前

    比如说

    const functionArr = [["find",[]],["sort",[{"name":-1}]],["toArray",[/*some function reference*/]]];
    

    你可以写,

    const functionChainResult = initialObj;
    functionArr.forEach(fn => {
      functionChainResult = functionChainResult.apply(window[fn[0]], fn[1]);
    });
    console.log(functionChainResult);
    

    使用除 window ,你可以看到 this .

        3
  •  0
  •   Viran Malaka    6 年前

    我从你的问题中了解到的是,你想基于一个数组来调用一些函数序列,这个数组在字符串中有一组函数名。如果我是对的,我想这个解决方案会对你有帮助。
    我们试着用 '应用' 函数中的特征。

    
    var arrx = [["find",[]],["sort",[{"name":-1}]],["toArray",[x]]];
    
    function callSequence(model, operationArray) {
      var res = model; // this will help to call function chain
    
      // recursive function
      function call(arr, index) {
        // arr[index][0] is current function name
        // arr[index][1] is current function arguments 
        res = res[arr[index][0]].apply({}, arr[index][1]);
        if(index < arr.length) {
          call(arr, index + 1); // call recursively throught the array.
        }
      }
    
      call(arrx, 0);
    }
    
    callSequence(Something, arrx);