alexandrknyazev13071995
@alexandrknyazev13071995

Какой самый быстрый способ удалить дубликаты из массива?

У меня имеется массив, в котором записано примерно 300 000 элементов (телефонные номера). Мне нужно, чтобы в этом массиве один и тот же элемент дважды не встречался. Как обработать такой массив, не дожидаясь конца света?
  • Вопрос задан
  • 5144 просмотра
Решения вопроса 3
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Самый быстрый способ, это обернуть массив в Set и получить из него новый массив:arr = Array.from(new Set(arr));Но работает только с примитивами (строки, числа, bool) т.к. объекты сравниваются по ссылке, на выходе будет новый массив

Если нужно производить манипуляции на текущем массиве, то есть способ чуть сложнее:
function dedupe(arr) {
  const values = new Set();
  const len = arr.length;
  let offset = 0;
  for(let i = 0; i < len; i++) {
    let val = arr[i];
    if(values.has(val)) {
      offset++;
    } else {
      values.add(val);
      arr[i - offset] = val;
    }
  }
  arr.length = len - offset;
}
Ответ написан
Комментировать
alexfilus
@alexfilus
Senior backend developer
Самое простое что приходит в голову - сделать телефоны ключами массива (если формат позволяет).
Ответ написан
Комментировать
@LiguidCool
В любом случае надо перебрать все.
А самый любимый мной вариант избавления от копий - запись массива в ассоциативный массив, где ключем является фильтруемое значение. Соответственно когда вы начнете писать значения с одинаковым ключем, то копии пропадут сами собой. Также можно при этом рассмотреть сравнение и выбор. Я такое на PHP проделывал, но думаю с JS проблем не будет.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@vshvydky
const uniq = (arr) => {
    let obj = {};    
    arr.forEach(elem=>{
        obj[elem] = null;
    });
    return Object.keys(obj);
};
Ответ написан
Комментировать
VGVolkov
@VGVolkov
самоучка
Я сортировал массив, затем запускал цикл с условием, что в результатный массив добавляется только тот элемент, впереди которого нет с таким же значением. На тестах не было ни одного сбоя.
var res = [];
newarr.sort();
for(let i = 0; i < newarr.length; i++){
if(newarr[i] != newarr[i+1]){
res.push(newarr[i]);
}
}
Ответ написан
Комментировать
Traineratwot
@Traineratwot
Web - программист
arr = arr.filter(function (item, pos) {
                return arr.indexOf(item) == pos;
            });


самый быстрый и самый надежный (из тех что мне попадались)

ТЕСТЫ скорости
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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