Передача нескольких / неизвестного числа переменных в JavasScript параметр? - PullRequest
0 голосов
/ 11 февраля 2019

Я создаю повторно используемую функцию с несколькими / неизвестным числом переменных и одного обратного вызова.

//the number of variable will be dynamic
var a = "this is a.";
var b = "this is b.";

function callback(){
 console.log('callback successful');
}

//totalUp() will be reusable function
function totalUp(allVariables, callback){
 console.log('Here are the complete list: ' + allVariables + '.');
 callback();
}

//how do I pass unknown number of arguments(a and b) into one parameter?
totalUp({a,b},callback);

В моем коде выше я передаю a и b в форме объекта, который нене работает.

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019
let allVars = [
    "this is a.",
    "this is b.",
]

Вы можете добавить еще несколько переменных в allVars и, следовательно, вы можете иметь неизвестное количество переменных.

Когда вы передаете его функции, у вас есть 2 варианта.

Первый - передать массив и использовать его в качестве массива

function totalUp(allVars, callback){
  let allVariables;
  for (let i = 0; i<allVars.length; i++) {
      allVariables += allVars[i] + ", ";
  }
  console.log('Here are the complete list: ' + allVariables + '.');
  callback();
}

Как уже упоминал Марвин, вы также можете использовать .join(), чтобы получить все переменные в массиве в одну строку.

function totalUp(allVars, callback){
  let allVariables = allVars.join(", ");
  console.log('Here are the complete list: ' + allVariables + '.');
  callback();
}

Второй - передать его как объект

let allVars = {
    a: "this is a.",
    b: "this is b."
}
0 голосов
/ 11 февраля 2019

Я бы изменил синатуру функции и сначала принял бы необходимый обратный вызов в качестве первого параметра, а затем принял бы динамические аргументы.

function upTo(cb, ...params) {
    cb(...params);
}

function cb(...params) {
    params.forEach(v => console.log(v));
}

upTo(cb, 1, 2, 3);

ES5

function upTo(cb) {
    cb.apply(null, Array.prototype.slice.call(arguments, 1));
}

function cb() {
    Array.prototype.slice.call(arguments).forEach(function (v) { console.log(v); });
}

upTo(cb, 1, 2, 3);
0 голосов
/ 11 февраля 2019

С ES6

Вы можете использовать для него деструктуризацию параметра:

function test(callback, ...params) {
    console.log(params); // ["a", "b"];
    console.log('Here are the complete list: ' + params.join(", ") + '.');
}

test(callback, "a", "b");

Без ES6

function test(params, callback) {
    console.log(params); // ["a", "b"];
    console.log('Here are the complete list: ' + params.join(", ") + '.');
}

test(["a", "b"], callback);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...