Распечатка всех дубликатов - Javascript - требуется альтернативное решение - PullRequest
2 голосов
/ 20 марта 2019

ИНСТРУКЦИИ

Given an array, print out all of the duplicates within that array.

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

const result = arr.filter(x => arr.filter(y => y === x).length > 1);

console.log(result);

// 2, 2, 3, 3, 5, 5, 8, 8

Итак, кто-то еще любезно предоставил этот ответ, который я понимаю, но я ищу альтернативное решение, котороевместо этого использует for-loop.

Я придумал это, но это только возвращает

2, 3, 5, 8 вместо вышеуказанных результатов, которые мне нужны.

const result2 = () => {
  let newArray = [];

  for(let i = 0; i < arr.length; i++) {
    if(arr[i] === arr[i + 1]) {
      newArray.push(arr[i])
    }
  }
   return newArray
}

console.log(result2(arr));

// 2, 3, 5, 8

Чего мне не хватает?Мне нужно, чтобы он распечатал все дубликаты, а не просто сказал мне, какие из них являются дубликатами.

Ответы [ 3 ]

2 голосов
/ 20 марта 2019
   let arr = [1, 2, 2, 3, 3, 4, 5, 5, 8, 8, 9, 10];
    var mem = {};
    var finalArr = [];
    for(var i = 0, j = arr.length; i< j; i++) {
        if(!mem.hasOwnProperty(arr[i])){
            mem[arr[i]] = [];
        }
        mem[arr[i]].push(arr[i]);
    }

    for(var i in mem) {
        if(mem.hasOwnProperty(i) && mem[i].length > 1) {
            finalArr = [...finalArr, ...mem[i]]
        }
    }
    console.log(finalArr);

Надеюсь, это поможет вам!

1 голос
/ 20 марта 2019

Фильтруя отсортированный массив

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

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

var res = arr.filter((v, i, a) => a[i - 1] === v || a[i + 1] === v);

console.log(res);
1 голос
/ 20 марта 2019

Ваш текущий

if(arr[i] === arr[i + 1]) {

не проверяет, был ли предыдущий элемент таким же (и, даже если его изменить на || arr[i] === arr[i - 1], он будет работать только с отсортированными массивами, что не было гарантировано).

let arr = [1, 2, 2, 3, 3, 4, 5, 5, 8, 8, 9, 10];
const result2 = () => {
  let newArray = [];

  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === arr[i + 1] || arr[i] == arr[i - 1]) {
      newArray.push(arr[i]);
    }
  }
  return newArray;
}

console.log(result2(arr));

Чтобы эмулировать существующий вложенный .filter, вам нужно выяснить, сколько совпадающих элементов в массиве - снова выполнить итерацию по массиву и проверить, сколько совпадений:

let arr = [1, 2, 2, 3, 3, 4, 5, 5, 8, 8, 9, 10];
const result2 = () => {
  let newArray = [];

  for (let i = 0; i < arr.length; i++) {
    let count = 0;
    for (let j = 0; j < arr.length; j++) {
      if (arr[i] === arr[j]) {
        count++;
      }
    }
    if (count >= 2) {
      newArray.push(arr[i])
    }
  }
  return newArray
}

console.log(result2(arr));

Но это имеет плохую вычислительную сложность (O(N^2)). Я бы предпочел подсчитать, сколько раз каждый элемент встречается раньше времени (O(N)):

let arr = [1, 2, 2, 3, 3, 4, 5, 5, 8, 8, 9, 10];
const result2 = () => {
  const countsByNum = arr.reduce((a, num) => {
    a[num] = (a[num] || 0) + 1;
    return a;
  }, {});
  let newArray = [];

  for (let i = 0; i < arr.length; i++) {
    if (countsByNum[arr[i]] >= 2) {
      newArray.push(arr[i]);
    }
  }
  return newArray
}

console.log(result2(arr));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...