打印出所有重复项-Javascript-需要替代解决方案

时间:2019-03-20 05:33:51

标签: javascript arrays for-loop

说明

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循环的替代解决方案。

我想到了这个,但这只会返回

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 个答案:

答案 0 :(得分:2)

   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 :(得分:1)

您当前的

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));

答案 2 :(得分:1)

通过过滤排序的数组

cancel