Удалить повторяющиеся элементы массива

Как удалить значения из массива которые повторяются, чтобы из массива [2,5,6,7,5,2,6] получить результат [7]


Ответы (4 шт):

Автор решения: Alexander Chernin

Что-то типа такого:

const array = [2,5,6,7,5,2,6];

// Цикл базовых значений
for(let i = 0; i < array.length; i++) {

  let flag = false; // Признак повторного значения
  let v = array[i]; // Текущее значение

  // Цикл поиска повторений
  for(let j = i + 1; j < array.length; j++) {
    if (v === array[j]) { // Если нашли повтор, то
      array.splice(j, 1); // Удаляем повторяющиеся элементы в массиве
      flag = true;
    }
  }
  if (flag) { // Был повтор
    array.splice(i, 1); // Удаляем сам элемент, если у него были повторения
    i = -1; // начинаем цикл [i] сначала
  }
}

console.log(array); // [7]
→ Ссылка
Автор решения: HaZcker

Я бы сделал так:

const sourceArray = [2,5,6,7,5,2,6]

// получаем массив уникальных элементов
function getUniqElements(arr) {
  const result = []
  
  const counts = getCounts(arr)

  counts.forEach(c => {
    if(c.count === 1) {
      result.push(c.key)
    }
  })
  
  return result
}

// получаем массив объектов, со значением (key) и кол-вом вхождений
function getCounts(arr) {
  const counts = [] // [{ key: 5, count: 2 }]
  
  arr.forEach((el) => {
    const countObject = counts.find(c => c.key === el)
    if (!countObject) {
      return counts.push({ key: el, count: 1 })
    }
    countObject.count++
  })
  
  return counts
}

console.log(getUniqElements(sourceArray))


UPD

А вот более лаконичный, но (скорее всего), менее производительный вариант

const sourceArray = [2, 5, 6, 7, 5, 2, 6]

function getUniqElements(arr) {
  const result = []

  arr.forEach((el, i) => {
    const arrClone = [...arr]
    arrClone[i] = null

    const set = new Set(arrClone)

    if (!set.has(el)) {
      result.push(el)
    }
  })

  return result
}

console.log(getUniqElements(sourceArray))

One more upd

Самый лаконичный вариант

const sourceArray = [2, 5, 6, 7, 5, 2, 6]

function getUniqElements(arr) {
  return arr.filter((el, i) => {
    arr[i] = null
    const isUniq = !arr.includes(el)
    arr[i] = el
    return isUniq
  })
}

console.log(getUniqElements(sourceArray))

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

Циклы в цикле для такой задачи явно не нужны, чуть больше элементов и сразу медленность будет заметна. Задача простая - обнаружить повторяющиеся

Алгоритм:

  • Объявляем словарик
  • Проходимся по массиву и смотрим есть ли входное число в словарике
  • Если есть, то кол-во увеличиваем на 1
  • Если нет, то записываем в словарь со значением 1
  • Проходимся по словарику и выбираем только тех у кого кол-во равно 1

const numbers = [2, 5, 6, 7, 5, 2, 6];

const withoutRepeats = (nums) => {
  const map = new Map();
  
  for (const num of nums) {
    if (map.has(num)) {
      map.set(num, map.get(num) + 1);
      continue;
    }
    
    map.set(num, 1);
  }
  
  const arr = [];
  
  for (const [key, value] of map) {
    if (value === 1) arr.push(key);
  }
  
  return arr;
}

console.log(withoutRepeats(numbers));

"Однострочный" вариант:

const numbers = [2, 5, 6, 7, 5, 2, 6];

const withoutRepeats = (nums) => [...nums.reduce((map, num) => {
    if (map.has(num)) {
      map.set(num, map.get(num) + 1);
      return map;
    }
    
    map.set(num, 1);
    
    return map;
    
  }, new Map())].reduce((arr, el) => {
    const [key, value] = el;
    
    if (value === 1) arr.push(key);
    
    return arr;
  }, [])

console.log(withoutRepeats(numbers));

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

Ну раз уж пошла такая пьянка то и я добавлю свой вариант с использованием filter (довольно короткий и простой между прочем):

let inputArr = [2,5,6,7,5,2,6]

function toUnique(arr) {
  return arr.filter(e =>
    arr.filter(r => e === r).length < 2
  )
}

console.log(toUnique(inputArr))

P.S.: Лично мне нравится последний вариант ответа от @HaZcker.

→ Ссылка