вопрос про 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. Другие - не пройдут.

Тоже самое можно рассматривать с любыми числами в любом массиве

→ Ссылка
Автор решения: EzioMercer

Просто доказательство от обратного:

Пусть утверждение "равенство с position выдает уникальные элементы" - неверное. Тогда у нас в результирующем массиве есть 2 элемента с одинаковым значением x. Это значит, что в исходном массиве были хотябы 2 x, но очевидно на разных позициях

Т.к. мы ищем наибольшую позицию, где находится x, то очевидно такая позиция единственная, следовательно может быть всего 1 x, который находится на данной позиции, следовательно 2 x не могли пройти проверку, следовательно в результирующий массив попадёт только 1 из них, следовательно в результирующем массиве 1 x

А это противоречит этому Тогда у нас в результирующем массиве есть 2 элемента с одинаковым значением x, значит исходное утверждение "равенство с position выдает уникальные элементы" - неверное - неверное, значит утверждение равенство с position выдает уникальные элементы - верное

→ Ссылка