Где ошибка в удалении дубликатов в массиве?

Подскажите пожалуйста где я допустил ошибку в коде. Функция должна выводить массив без дубликата
const duplicateArray = ['a','b','c','a','b','c','q'];
function funcDeleteDuplicate(array) {
    for (let i = 0; i <= array.length; i++) {
        if (array.indexOf(array[i]) === i) {
            array.splice(i,1);
        }
    }
    return array;
}
console.log(funcDeleteDuplicate(duplicateArray));
  • Вопрос задан
  • 82 просмотра
Решения вопроса 3
@dGololobov
начинающий
Ошибка в том, что вы мутируете входящий массив.

создайте дополнительный пустой массив, в который складывайте уникальные значения.
И потом вернете его.
А вообще есть и более красивые способы создать массив с уникальными значениями.
Ответ написан
Комментировать
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
const duplicateArray = ['a', 'b', 'c', 'a', 'b', 'c', 'q'];
console.log(
    Array.from(new Set(duplicateArray))
);

const duplicateArray = ['a', 'b', 'c', 'a', 'b', 'c', 'q'];
console.log(
    duplicateArray.reduce(function (carry, item) {
        if (!carry.includes(item)) carry.push(item);
        return carry;
    }, [])
);

const duplicateArray = ['a', 'b', 'c', 'a', 'b', 'c', 'q'];
console.log(
    [...duplicateArray.reduce((carry, item) => [...carry].includes(item) ? carry : carry + item, '')]
);
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Ошибки:
  1. когда удаляется один элемент из массива, текущее значение i уже начинает указывать на следующий,
    но цикл for() увеличит i ещё на 1, и получится, что 1 элемент пропустили. Чинится уменьшением i на 1 сразу после удаления 1 элемента.
  2. верхнее значение i должно быть не меньше-или-равно, а меньше, чем длина массива.
  3. если текущий элемент дубль, то его индекс НЕ равен indexOf(value)

Вот так работает:
const duplicateArray = ['a', 'b', 'c', 'a', 'b', 'c', 'q'];

function funcDeleteDuplicate(array) {
  for (let i = 0; i < array.length; i++) {
    if (array.indexOf(array[i]) !== i) {
      array.splice(i, 1);
      i--;
    }
  }
  return array;
}
console.log(funcDeleteDuplicate(duplicateArray));
// [ "a", "b", "c", "q" ]


Лучше:
Когда речь об уникальных значениях, удобнее использовать Set — это коллекция, которая сохраняет только уникальные значения. Такой вариант хорош ещё тем, что не изменяет исходный массив.
const funcDeleteDuplicate = array => [...new Set(array)];
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы