Параметры функции 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, которая идет перед стрелкой).