@HarryDaamn

Как получить дубликаты из масиива и вывести их?

Всем добрый вечер! Мне нужно получить все дубликаты из массива и вернуть их в функцию. Спойлер функция работает. Проблема только в массиве с [0,0,0,0]
function getDuplicates(items) {
  // write code here
  const sortedArr = items.slice().sort();

  const results = [];

  for(let i = 0; i < sortedArr.length; i++) {
    if(sortedArr[i + 1] == sortedArr[i]) {
      results.push(sortedArr[i]);
    }
  }

  return results;
}


5f6b9a0994910988343948.png
  • Вопрос задан
  • 276 просмотров
Решения вопроса 2
hzzzzl
@hzzzzl
Проблема только в массиве с [0,0,0,0]

с любым массивом, в котором элемент повторяется больше чем 2 раза

function getDuplicates(items) {
  const sortedArr = items.slice().sort();
  const results = new Set();  // <= только уникальные

  for(let i = 0; i < sortedArr.length; i++) {
    if(sortedArr[i + 1] == sortedArr[i]) {
      results.add(sortedArr[i]);  // <= добавится в Set только один раз
    }
  }

  return Array.from(results);
}
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
if(sortedArr[i + 1] == sortedArr[i]) {
  results.push(sortedArr[i]);
}

Недостаточное условие. Если четыре нуля идут подряд - сколько раз после нуля можно найти равное ему значение? Правильно, три раза - после первого, второго и третьего. Надо ещё проверять, что предыдущий элемент не равен текущему:

const getDuplicates = arr => arr
  .slice()
  .sort()
  .reduce((acc, n, i, a) => (n === a[i + 1] && n !== a[i - 1] && acc.push(n), acc), []);

Но вообще, использовать сортировку не обязательно, есть и другие способы:

const getDuplicates = arr => Array
  .from(arr.reduce((acc, n) => acc.set(n, (acc.get(n) ?? 0) + 1), new Map))
  .reduce((acc, n) => (n[1] > 1 && acc.push(n[0]), acc), []);

const getDuplicates = arr => Object
  .entries(arr.reduce((acc, n) => (acc[n] = acc.hasOwnProperty(n), acc), {}))
  .filter(n => n[1])
  .map(n => +n[0]);

const getDuplicates = arr =>
  [...arr.reduce((acc, n) => (acc[+acc[0].has(n)].add(n), acc), [ new Set, new Set ])[1]];

const getDuplicates = arr =>
  [...new Set(arr.filter((n, i, a) => a.includes(n, i + 1)))];

const getDuplicates = arr => arr
  .filter((n, i, a) => i !== a.indexOf(n))
  .filter((n, i, a) => i === a.indexOf(n));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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