Передайте все значения из массива в функцию как параметры
У меня есть массив значений:
['a', 'b', 'c', 'd']
и мне нужно передать их как параметры в функцию:
window.myFunction('a', 'b', 'c', 'd');
Это было бы проще, если бы я мог просто передать массив/объект в функцию, но функции написаны другими людьми или уже существуют, и я не могу их изменить - их нужно передавать как индивидуальные параметры, что и есть то, что я нужно решить.
Количество передаваемых значений несовместимо. Это может быть один, может быть 100.
Опять же, я не могу повлиять на функции. Они такие, как они есть, и я всегда получаю массив значений, чтобы пройти в них.
Ответы
Ответ 1
Используйте метод .apply
объекта Function.
window.myFunction.apply(window, ['a','b','c','d']);
Метод .apply
вызывает вызываемую вами функцию, но позволяет установить значение функции this
(первый аргумент) и позволяет устанавливать его аргументы с использованием массива (второй аргумент).
Итак, мы сохранили window
как значение this
, и мы передаем массив как отдельные аргументы. Члены массива будут распределены так, как если бы они были переданы как отдельные аргументы, так что, если бы вы это сделали:
window.myFunction('a','b','c','d');
Ответ 2
Try
window.myFunction.apply(window, ['a', 'b', 'c', 'd']);
Ответ 3
var arr = ['a','b','c'];
function echo(x){
console.log(x)
}
function go(){
arr.map(echo);
}
<button onclick="go()">Test</button>
Ответ 4
В ES6 вы можете использовать синтаксис распространения.
Как от Docs:
Синтаксис спредов позволяет разворачивать итерацию, такую как выражение или строку массива, в местах, где ожидаются нулевые или более аргументы (для вызовов функций) или элементы (для литералов массива), или выражение объекта, которое должно быть расширено в местах, где нулевые или более пары ключей-значений (для объектных литералов).
Ваш синтаксис будет выглядеть следующим образом:
var array = ['a', 'b', 'c', 'd'];
myFunction(...array);
Demo:
var array = ['a', 'b', 'c', 'd'];
myFunction(...array);
function myFunction(p1, p2, p3, p4) {
console.log(p1, p2, p3, p4);
}