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

Я получил этот вопрос для практики, и формулировка смутила меня, так как я вижу 2 результата, которые он мог бы хотеть.

И в любом случае, я хотел бы увидеть оба решения.

Например, если у меня есть массив:

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];

Я воспринимаю это как желание получить конечный результат как:

let finalResult = [1, 2, 3, 4, 5, 8, 9, 10];

ИЛИ ЖЕ:

let finalResult = [1, 9, 10];

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

В любом случае, я хотел бы написать две функции, которые выполняют одну из них.

Это, данное кем-то другим, дает мне второе решение.

let elems = {},

arr2 = arr.filter(function (e) {
   if (elems[e] === undefined) {
       elems[e] = true;
    return true;
  }
  return false;
});
console.log(arr2);

Я не уверен насчет функции для первого (удалите все дубликаты).

Ответы

Ответ 1

Использование Set и Array.from()

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];

console.log(Array.from(new Set(arr)));

Ответ 2

Просто используйте простой array.filter:

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];
let finalResult = arr.filter((e, i, a) => a.indexOf(e) == i).sort(function(a, b){return a - b});
console.log(finalResult);

Ответ 3

Для первой части вы можете использовать Set() и Spread Syntax для удаления дубликатов.

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];
let res = [...new Set(arr)]
console.log(res)

Ответ 4

Вы можете создать оба массива в One Go

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];
let unique = new Set();
let repeated = Array.from(arr.reduce((acc, curr) => {
	acc.has(curr) ? unique.delete(curr) : acc.add(curr) && unique.add(curr);
	return acc;
}, new Set()));

console.log(Array.from(unique))
console.log(repeated)

Ответ 5

Вы можете использовать Array.prototype.reduce() для создания hash объекта, где keys являются числа в массиве, а values будут повторяться в виде чисел в переменной массива arr.

Затем с помощью Object.keys():

  • Удалить все дубликаты Object.keys(hash)
  • Удалите все дубликаты, кроме фильтрации с помощью Array.prototype.filter(), чтобы получить числа только в одном случае.

Код:

const arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];
const hash = arr.reduce((a, c) => (a[c] = (a[c] || 0) + 1, a), {});

// [1, 2, 3, 4, 5, 8, 9, 10];
const finalResultOne = Object.keys(hash);

// [1, 9, 10];
const finalResultTwo = Object.keys(hash).filter(k => hash[k] === 1);

console.log('finalResultOne:', ...finalResultOne);
console.log('finalResultTwo:', ...finalResultTwo);

Ответ 6

Вы можете использовать closure и Map

let arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];

const build = ar => {
  const mapObj = ar.reduce((acc, e) => {
    acc.has(e) ? acc.set(e, true) : acc.set(e, false)
    return acc
  }, new Map())
  
  return function(hasDup = true) {
    if(hasDup) return [...mapObj.keys()]
    else return [...mapObj].filter(([key, val]) => !val).map(([k, v])=> k)
  }
}

const getArr = build(arr)

console.log(getArr())
console.log(getArr(false))

Ответ 7

Вы могли отсортировать массив и отфильтровать массив, проверив только одну сторону на наличие дубликатов или обе стороны.

var array = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10],
    result1,
    result2;

array.sort((a, b) => a - b);

result1 = array.filter((v, i, a) => a[i - 1] !== v);
result2 = array.filter((v, i, a) => a[i - 1] !== v && a[i + 1] !== v);

console.log(...result1);
console.log(...result2)

Ответ 8

Как уже говорили многие, первый - это просто [...new Set(arr)]

Во-вторых, просто отфильтруйте те, которые встречаются более одного раза:

const arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];

const count = (arr, e) => arr.filter(n => n == e).length

const unique = arr => arr.filter(e => count(arr, e) < 2)

console.log(unique(arr));

Ответ 9

var arr = [1, 2, 4, 2, 3, 3, 4, 5, 5, 5, 8, 8, 9, 10];
var map = {};
var finalResult = [];
for (var i = 0; i < arr.length; i++) {
  if (!map.hasOwnProperty(arr[i])) {
    map[arr[i]] = true;
    finalResult.push(arr[i]);
  }
}

//if you need it sorted otherwise it will be in order
finalResult.sort(function(a, b) {
  return a - b
});

console.log(finalResult);