Параметры функции JavaScript для функции фильтра
numbers = [1,2,3,4,5,4,3,2,1];
var filterResult = numbers.filter(function(i){
return (i > 2);
});
Я не понимаю, как это работает. если я опускаю я как аргумент функции, он прерывает функцию, но я не привязан ни к чему, поэтому зачем это нужно?
Ответы
Ответ 1
.filter
(Array.prototype.filter
) вызывает функцию с тремя аргументами:
function(element, index, array) {
...
-
element
- это конкретный элемент массива для вызова.
-
index
- текущий индекс элемента
-
array
- это фильтруемый массив.
Вы можете использовать любой или все аргументы.
В вашем случае i
относится к element
и используется в теле вашей функции:
function(i){
return (i > 2);
}
Другими словами, "фильтрующие элементы, где element
больше 2".
Ответ 2
i - ссылка на текущий объект в наборе, когда внутри этого закрытия. Его можно назвать чем угодно, поскольку это всего лишь переменная, но тогда должно быть одно и то же имя внутри закрытия. Вместо использования function(){}
вы можете использовать обратный вызов, который был разработан как filter
.
Ссылка делается неявно по определению .filter
, вы можете прочитать здесь: http://msdn.microsoft.com/en-us/library/ff679973(v=vs.94).aspx
Ответ 3
i
действительно очень важен. Он сообщает, что дает информацию о функциях фильтра об элементах, на которых он действует. Фактически он использовал здесь (i > 2)
.
Здесь сохраняются элементы, значение которых больше 2.
Ответ 4
Этот i
является формальным параметром для функции, которую вы предоставляете .filter()
. Если вы не вставляете его, функция не будет иметь никакого отношения¹, чтобы ссылаться на передаваемый им аргумент (i
внутри тела функции будет ссылаться на какой-то другой объект, который может даже не быть определен - window.i
будет быть типичным).
¹, что является технически ложью, но считайте это справедливым для целей этого обсуждения.
Ответ 5
Старый поток действительно, но просто заполняет то, что остается невысказанным.
В скобках есть программа для вставки любого имени переменной для вашей конкретной программы.
Если вы выберете "i", большинство других (начинающих) программистов могут подумать "О, я означает индекс". Что было бы неправильно.
Если вы используете один аргумент вместо трех, я бы выбрал "el" для представления элемента, или если ваш массив содержит ароматы соды, я бы выбрал "аромат".
Ответ 6
Эта запись ES5 и, возможно, если вы увидите ее в записи ES6, вы поймете, почему "i" является обязательным:
numbers.filter(i => i > 2);
Переменная должна всегда использоваться для ссылки на элемент массива, который вы обрабатываете на каждой итерации (в данном случае "i"). Он должен быть передан в качестве аргумента в точку входа функции (в ES6, которая идет перед стрелкой).