2012-06-27 2 views
9
numbers = [1,2,3,4,5,4,3,2,1]; 
var filterResult = numbers.filter(function(i){ 
    return (i > 2); 
});  

Я не понимаю, как это работает. если я опускаю i как аргумент функции, он прерывает функцию, но i не привязан ни к чему, поэтому зачем это нужно?Параметры функции JavaScript для функции фильтра

+2

Возможно, этот ресурс полезен для вас: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter – Niko

+0

Таким образом, i используется функцией фильтра как способ передать любое значение при индексе чисел есть? javascript идет и получает каждый элемент, я просто должен сказать ему, что делать с i? – Kevin

+0

Простыми словами: если вы вызываете filter() в массиве, JavaScript принимает каждое значение этого массива и вызывает указанную вами функцию (в этом случае 'function (i) {return (i> 2);}' и вызывает эта функция передаёт текущее значение, которое обрабатывается как параметр для этой функции. Поскольку вы назвали первый параметр, который ваша функция принимает «i», теперь вы можете работать с переменной i внутри этой функции. «true», значение будет в новом массиве, который возвращает filter(), если он вернет «false», он будет пропущен. Таким образом, вы можете легко «фильтровать» массив. – Niko

ответ

25

.filter (Array.prototype.filter) вызывает указанную функцию с 3-мя аргументами:

function(element, index, array) { 
    ... 
  • element является конкретным элементом массива для вызова.
  • index - текущий индекс элемента
  • array - это фильтр, фильтруемый.

Вы можете использовать любой или все аргументы.

В вашем случае, i относится к element и используется в теле вашей функции:

function(i){ 
    return (i > 2); 
} 

Другими словами, «фильтрующие элементы, где element больше 2».

+1

+1, мне нравится ясность этого объяснения. –

+1

Thanks ветчина ish, Так что я могу вызвать фильтр на массиве массивов? это то, к чему относится индекс и элемент? и я не уверен, что понимаю передачу части массива. Разве это уже не покрыто, когда я говорю numbers.filter. Проводит ли javascript этот указатель, если я ничего не добавлю? – Kevin

+0

Если массив представляет собой массив массивов, 'element' будет массивом. Положите это так, для каждого вызова функции, 'element == array [index]'. Не уверен, что последнее предложение в вашем комментарии означает, извините. – Hamish

0

i на самом деле очень важно. Он сообщает, что дает информацию о функциях фильтра об элементах, на которых он действует. Фактически он используется здесь (i > 2).

Это удерживает элементы, значение больше, чем 2.

3

я представляет собой ссылку на текущий объект в наборе, когда внутри этой крышки. Его можно назвать чем угодно, поскольку это всего лишь переменная, но тогда должно быть одно и то же имя внутри закрытия. Вместо использования function(){} вы можете использовать обратный вызов, который был разработан как filter.

Ссылка делается неявно по определению .filter, вы можете прочитать здесь: http://msdn.microsoft.com/en-us/library/ff679973(v=vs.94).aspx

0

Это i является формальным параметром для функции вы подача в .filter(). Если вы не введете его, функция не будет иметь никакого отношения¹, чтобы ссылаться на аргумент, который он передал (i внутри тела функции будет ссылаться на какой-то другой объект, который может даже не быть определен - window.i будет типичным).


¹ что технически ложь, но считают это верно для целей этой дискуссии

0

Старая нить действительно, но только заполнение того, что остается невысказанным.

Скобки предназначены для вас, чтобы программист вставлял любое имя переменной для вашей конкретной программы.

Если вы выберете «i», большинство других (начинающих) программистов могут подумать «О, я означает индекс». Это было бы неправильно.

Если вы используете один аргумент вместо трех, я бы выбрал «el» для представления элемента, или если ваш массив содержит ароматы соды, я бы выбрал «аромат».

Смежные вопросы