JavaScript, как вызвать функцию функции и т. Д. На основе массива? - PullRequest
0 голосов
/ 06 февраля 2019

Я действительно не знаю, как сформулировать этот вопрос, поэтому у меня возникли некоторые проблемы с поиском в Google, но я пытаюсь сделать, в основном, вспомогательную функцию для изменения данных 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", [/ ссылка на некоторую функцию /]]],

Я должен иметь возможность получить результат :thing.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 ]

0 голосов
/ 06 февраля 2019

Допустим, вы можете написать

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 .

0 голосов
/ 06 февраля 2019

Из вашего вопроса я понимаю, что вы хотите вызвать некоторую последовательность функций, основанную на массиве, в котором задано имя функции в строках.Если я прав, думаю, это решение поможет вам.
Давайте попробуем использовать функцию 'apply' в функции.


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);
0 голосов
/ 06 февраля 2019

Вы просто анализируете имя таблицы

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

Теперь Jstr содержит

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

Как и вы, вы можете проанализировать и получить значение.

...