var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];
for (var i = 0; i < numbers.length; i++) {
if (numbers.indexOf(numbers[i]) == numbers.lastIndexOf(numbers[i])) {
uniqueNumbers.push(numbers[i]);
}
}
console.log(uniqueNumbers);
как раз верный вопрос был бы “есть ли смысл вообще использовать var?” т.к. var это легаси вариант уже. Он не применяется уже, разве что в проектах с “бородой”.
Но почему тогда практически все примеры кода на форуме именно с использованием var?
И как я понял между ними есть разница, let более ограниченный вариант, тогда почему лучше использовать его?
потому что авторы курсов мягко говоря подзабили на актуальность. var устарел еще в ES-2015> как раз когда эти курсы появились и только сейчас в 2020 они очухались и стали переписывать примеры, хотя это нужно было сделать еще 5 лет назад.
let не хуже, у него другая область видимости.
Решил таким способом.
Брал искомый элемент, менял его местами с нулевым индексом, затем, начиная с первого индекса, проверял, есть ли еще индекс с таким значением, если нет (-1), то добавлял элемент на нулевом индексе в новый массив.
К сожалению упустил информацию про lastIndexOf()
Сводка
let numbers = [1, 7, 3, 4, 2, 1, 6, 3];
let uniqueNumbers = [];
for (let i = 0; i <= numbers.length - 1; i++) {
let swap = numbers[0]
numbers[0] = numbers[i]
numbers[i] = swap
if (numbers.indexOf(numbers[0], 1) == -1) {
uniqueNumbers.push(numbers[0])
}
}
Не понял, как работает это сравнение. Как я понимаю логику - мы берём i-тый индекс и последний индекс и если они равны - то записываем значение в новый массив. Но программа работает наоборот и мне не понятно почему. Можете объяснить?
что значит “работает наоборот”?
вы верно поняли логику.
на каждой итерации вызывается метод indexOf, который возвращает индекс первого вхождения элемента в массиве. если этот индекс совпадает с результатом вызова метода lastIndexOf (который возвращает индекс первого вхождения данного элемента в массиве с обратной стороны), то значит элемент уникальный и мы записываем его значение в результирующий массив, который и должен содержать только уникальные элементы.
Но как?
К примеру такой массив: [1, 2, 3, 1]
Мы сравниваем первый и последний, они равны и записываем их в массив уникальных, но они же не уникальны, а одинаковы.
Вот мой вариант
let numbers = [1, 4, 5, 9, 2, 5, 1];
let uniqueNumbers = [];
for (let i = 0; i <= numbers.length-1; i++) {
if (numbers.lastIndexOf(numbers[i]) === i && numbers.indexOf(numbers[i]) === i) {
uniqueNumbers.push(numbers[i]);
}
}
}