вопрос про lastIndexOf
кто-нибудь может мне объяснить как это работает? какая здесь логика? почему равенство с position выдает уникальные элементы? спасибо
const a = [1, 9, 2, 2, 3, 4, 1, 7, 8, 0, 9, 0, 1, 5, 3];
const b = a.filter(function(item, position, array) {
return a.lastIndexOf(item) === position;
});
console.log(a); // [1, 9, 2, 2, 3, 4, 1, 7, 8, 0, 9, 0, 1, 5, 3]
console.log(b); // [2, 4, 7, 8, 9, 0, 1, 5, 3]
Ответы (2 шт):
Метод filter() создаёт новый массив со всеми элементами, прошедшими проверку, задаваемую в передаваемой функции. Это значит, что если внутри функции какое-то условие вернёт true, то элемент попадёт в результирующий массив. Пример.
let array = [1,2,3,4,5];
let result = array.filter((el, index) => index === 0 || index === array.length - 1);
console.log(result);
В результат попали элементы, которые стоЯт на по индексу 0 или на последнем месте. Их, очевидно, всего два.
lastIndexOf возвращает последний индекс, по которому данный элемент может быть найден в массиве. Очевидно, что такой индекс может быть только один (вариант, когда ничего не найдено - не рассматриваем). Всегда один.
Допустим есть массив [0, 0, 0, 0, 0, 0]. lastIndexOf в этом массиве всегда будет возвращать нам 5. А filter нам вернёт только тот элемент у которого 5 === position (index). Получается, что у нас 6 итераций такого вида:
return 5 === 0
return 5 === 1
return 5 === 2
return 5 === 3
return 5 === 4
return 5 === 5
Из всех условий подойдёт только последнее и вернётся только тот ноль, что стоИт на позиции 5. Другие - не пройдут.
Тоже самое можно рассматривать с любыми числами в любом массиве
Просто доказательство от обратного:
Пусть утверждение "равенство с position выдает уникальные элементы" - неверное. Тогда у нас в результирующем массиве есть 2 элемента с одинаковым значением x. Это значит, что в исходном массиве были хотябы 2 x, но очевидно на разных позициях
Т.к. мы ищем наибольшую позицию, где находится x, то очевидно такая позиция единственная, следовательно может быть всего 1 x, который находится на данной позиции, следовательно 2 x не могли пройти проверку, следовательно в результирующий массив попадёт только 1 из них, следовательно в результирующем массиве 1 x
А это противоречит этому Тогда у нас в результирующем массиве есть 2 элемента с одинаковым значением x, значит исходное утверждение "равенство с position выдает уникальные элементы" - неверное - неверное, значит утверждение равенство с position выдает уникальные элементы - верное