добавление уникальных элементов в массив. как улучшить решение?

192
03 мая 2022, 03:40

let numbers = [89, 17, 156, 89, 156, 156, 89, 6, 89, 89, 30];
let uniqueNumbers = [];
for (let i = 0; i < numbers.length; i++) {
  let count = 0;
  for (let j = 0; j < numbers.length; j++) {
    if (numbers[i] === numbers[j]) count++;
    if (count > 1) break;
    if (count === 1 && j === numbers.length - 1)
      uniqueNumbers.push(numbers[i]);
  }
}
console.log(uniqueNumbers);
// [17,6,30] должно получиться.

Answer 1

Можно сделать так:

const numbers = [89, 17, 156, 89, 156, 156, 89, 6, 89, 89, 30];
const arr = numbers.filter(e => numbers.indexOf(e) === numbers.lastIndexOf(e));
console.log(arr);
// [17,6,30] должно получиться.

Либо, если не важен изначальный порядок, то так:

const numbers = [89, 17, 156, 89, 156, 156, 89, 6, 89, 89, 30];
const arr = numbers.sort((a, b) => a - b);
const uniq = [];
for (let i = 0, last = 0; i < arr.length - 1; i++) {
  if (arr[i] !== arr[i + 1] && last !== arr[i])
    uniq.push(arr[i]);
  last = arr[i];
}
console.log(uniq);
// [17,6,30] должно получиться.

Либо через двойной цикл:

const numbers = [89, 17, 156, 89, 156, 156, 89, 6, 89, 89, 30];
const uniq = [];
for (let i = 0, f = 0; i < numbers.length; (i++, f=0)) {
  for (let j = 0; j < numbers.length; j++)
    if (numbers[i] === numbers[j] && i !== j) f = 1;
  if (!f) uniq.push(numbers[i]);
}
console.log(uniq);
// [17,6,30] должно получиться.

Сравнение производительности:

// [17, 6, 30] должно получиться
// Вариант А
const a = performance.now();
const numbersA = [89, 17, 156, 89, 156, 156, 89, 6, 89, 89, 30];
const arrA = numbersA.filter(e => numbersA.indexOf(e) === numbersA.lastIndexOf(e));
console.log(arrA);
console.log(performance.now() - a);
// Вариант Б
const b = performance.now();
const numbersB = [89, 17, 156, 89, 156, 156, 89, 6, 89, 89, 30];
const uniqB = [];
for (let i = 0, f = 0; i < numbersB.length; (i++, f = 0)) {
  for (let j = 0; j < numbersB.length; j++)
    if (numbersB[i] === numbersB[j] && i !== j) { f = 1; break; }
  if (!f) uniqB.push(numbersB[i]);
}
console.log(uniqB);
console.log(performance.now() - b);
// Вариант В
const c = performance.now();
const numbersC = [89, 17, 156, 89, 156, 156, 89, 6, 89, 89, 30];
const arrC = numbersC.sort((a, b) => a - b);
const uniqC = [];
for (let i = 0, last = 0; i < arrC.length - 1; i++) {
  if (arrC[i] !== arrC[i + 1] && last !== arrC[i])
    uniqC.push(arrC[i]);
  last = arrC[i];
}
console.log(uniqC);
console.log(performance.now() - c);
// Вариант Г (Ваш)
const g = performance.now();
const numbersG = [89, 17, 156, 89, 156, 156, 89, 6, 89, 89, 30];
const uniqG = [];
for (let i = 0; i < numbersG.length; i++) {
  let count = 0;
  for (let j = 0; j < numbersG.length; j++) {
    if (numbersG[i] === numbersG[j]) count++;
    if (count > 1) break;
    if (count === 1 && j === numbersG.length - 1)
      uniqG.push(numbersG[i]);
  }
}
console.log(uniqG);
console.log(performance.now() - g);

READ ALSO
Вставить переменную PHP [дубликат]

Вставить переменную PHP [дубликат]

Как вставить переменную между тегами p

250
Js scrollTo behavior smooth

Js scrollTo behavior smooth

Есть такой код, который выполняется при событии onWheel

299