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

Я нахожусь в процессе создания класса JavaScript, который обрабатывает маршрутизацию/хеширование.

Мне интересно, есть ли способ разделить строку window.location.hash на набор аргументов для передачи другой функции.

Пример хеша:

var hash = "#some/place?id=42&&name=Brian";

Я могу, конечно, разбить строку и получить аргументы и их значения, но как мне передать их функции, аналогичной (с учетом предыдущего хэша), вызывающей:

// ID, NAME
someFunction(42, "Brian");

Мы должны принять во внимание, что мы не знаем точное количество аргументов, с которыми будем иметь дело. Все, что мы знаем, это то, что аргументы в хеше находятся в том же порядке, что и функция; например: учитывая предыдущий пример, наша функция получит: сначала ID, затем NAME, затем любые другие аргументы, которые мы передаем.

So...

var hash = "#some/place?id=42&&name=Brian";

// ID, NAME
someFunction(42, "Brian");

Or...

var hash = "#some/place?id=42&&age=33&&name=Brian";

// ID, AGE, NAME
someFunction(42, 33, "Brian");

так далее...


person Aaron    schedule 08.04.2016    source источник
comment
вы спрашиваете, как извлечь параметры из строки запроса или как вызвать someFunction с неизвестным количеством параметров?   -  person Ray Wadkins    schedule 08.04.2016
comment
что касается передачи неизвестного количества параметров, я бы создал массив и передал его, после чего вы можете перебрать его в своей функции. Может быть, массив объектов [{id: 42}, {age: 33}, {name: 'brian'}]   -  person IrkenInvader    schedule 08.04.2016
comment
Вы можете сделать это, но вам также следует проверить Function.prototype.apply(developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/)   -  person Ray Wadkins    schedule 08.04.2016
comment
@IrkenInvader Я думал об этом, но это не тот конечный результат, который мне нужен. :)   -  person Aaron    schedule 09.04.2016


Ответы (2)


Вы можете использовать метод Function.prototype.apply(), чтобы предоставить функции список аргументов. Первый аргумент устанавливает привязку this для функции, поэтому для функций, которые не работают в рамках объекта, вы можете передать null в качестве первого аргумента.

var hash = "#some/place?id=42&&age=33&&name=Brian";

var getParams = function(hash){

  var parameters = [ ["id=","&&age"],["age=","&&name"],["name=",null] ];

  return parameters.map(function(p){

    var re1 = new RegExp(p[0]);
    var re2 = p[1]? new RegExp(p[1]): null;

    var start = hash.match(re1)['index'] + p[0].length;
    var end = re2 ? hash.match(re2)["index"]: hash.length;

    return hash.slice(start,end);

  })

};

function interpreter(id,age,name,kwargs){
  console.log( "id: "+id + " age: "+ age+ " name: "+name+ " kwargs: "+ kwargs );
}

interpreter.apply( null, getParams(hash) ) ;
person nick    schedule 08.04.2016
comment
Мне помогло использование метода Function.prototype.apply() и передача массива аргументов. Спасибо! :) - person Aaron; 09.04.2016

Вы можете поймать аргументы в такой функции:

var x = function(){

x = arguments&&arguments[0];
y= arguments&&arguments[1];
console.log(x+y);

};
x(3,4);
7
person Prashant Pandey    schedule 08.04.2016
comment
Привет. Недостатком этого является то, что вызываемая функция не должна перебирать аргументы, например: она должна ожидать: function someFun(param1, param2, ...) {} Вызываемая функция ожидает определенное количество аргументов, но мы не Не знаю, сколько нам нужно дать, если это имеет смысл? По сути, мы можем передать функции неопределенное количество аргументов, но функция ожидает их определенное количество. Кроме того, функция должна работать следующим образом: // param1 = Dave, param2 = Davidson someFunc(param1, param2, ...) { return param1 + param2; } ... как будто мы передаем аргументы как обычно. - person Aaron; 09.04.2016