Давайте начнем с filter:
Фильтр() создает новый массив со всеми элементами, которые проходят тест, реализованный предоставленной функцией.
a
- это случайное число массива, к которому применяется фильтр. Вся суть заключается в следующем утверждении:
return !this[a] ? this[a] = true : false;
this[a]
Если это верно, то a
уже был обработан один раз, и он был добавлен к этому в качестве одного из его свойств. В противном случае this[a]
является ложным. Таким образом, результат его отрицания верен, и текущий a
должен быть возвращен. Кроме того, значение this[a]
будет равно true, а затем мы перейдем к следующему a
.
Следующий фрагмент кода поможет вам понять, что filter
делает:
var numbers = [1,2,3,4,5];
var filteredNumbers = numbers.filter(function(number){
console.log(number);
return number > 2;
});
console.log(filteredNumbers);
И следующий фрагмент покажет вам в действии, что происходит в unique
функции:
function unique (array) {
return array.filter(function(a){
console.log(this);
return !this[a] ? this[a] = true : false;
}, {});
}
var array = [1,2,3,1,2,3,4,5,5,6];
console.log(unique(array));
Я понимаю основную логику фильтра, но то, что я не является {} передается в качестве 2-го аргумента, и как каждое значение добавляется в новый массив с! Это [а]
Второй аргумент - необязательное значение, которое вы можете передать методу filter
, и его можно использовать как this
, когда будет выполнен ваш обратный вызов (проверьте ссылку, о которой я упомянул в начале около filter
). Вы передаете туда пустой объект. Когда вы используете ключевое слово this
в своем обратном вызове, обратитесь к этому объекту. Вот почему в первый раз, когда код получает этот метод, возвращается {}
. Проверьте первую строку вывода второго фрагмента.
Я объясню вторую часть вашего вопроса, основываясь на втором фрагменте. При первом запуске у вас есть пустой объект (я говорю об этом), а первый обработанный номер равен 1. Таким образом, этот 1 не будет определен. Итак, !this[1]
будет правдой. Таким образом, первая часть после ?
выполнена который является присвоение
this[1] = true.
Теперь this
приобрел свой первый ключ, 1, со значением true
. Кроме того, 1 будет возвращен из фильтра. То же самое происходит и с 2 и 3. Когда мы приходим к 1, то
!this[1]
является ложным, так как this[1]
верно. Так возвращается false, и 1 теперь не будет добавлен в массив, который будет возвращен после обработки всех элементов массива.
- это индекс ??? –
Нет, это случайный элемент вашего массива. – Christos
@ManosKounelakis, пожалуйста, посмотрите на фрагмент, который я добавил, чтобы увидеть его в действии. – Christos