How to keep Duplicates of an Array

You could filter by checking if the item is the first one and if the last index is not the actual index.

var array = [1, 1, 2, 3, 3, 3, 3, 4, 5, 5],
    result = array.filter((a, i, aa) => aa.indexOf(a) === i && aa.lastIndexOf(a) !== i);

console.log(result);

All of the above using O(n2) which is expansive, if you want to achieve O(n) time so here is the solution.

function getDuplicates(arr){
  const hashTable = {} 
  const duplicate = [];
  arr.forEach((item) => {
    if(hashTable[item]){
      if(hashTable[item] === 1){
         duplicate.push(item);
      }
     hashTable[item] = hashTable[item] + 1;
    } else {
      hashTable[item] =1;
    }
  })

  return duplicate;
}

I also write the article to how effectively remove duplication from the array by using a javascript object like a hashtable.


You can use array#reduce to count the frequency of each value and then array#filter values whose count is greater than 1.

var data = [1,1,2,3,3,3,3,4,5,5];
var count = data.reduce((o,v)=>{
  o[v] = o[v]+1 || 1;
  return o;
},{});

var duplicate = Object
                  .keys(count)
                  .filter(k => count[k] > 1)
                  .map(Number);
console.log(duplicate);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Another version of solution using Map.

var data = [1,1,2,3,3,3,3,4,5,5];
var count = data.reduce((map,v)=>{
  map.set(v, (map.get(v) || 0) + 1);
  return map;
},new Map());

var duplicate = Array.from(count)
                     .filter(a => a[1] > 1)
                     .map(a => a[0]);
console.log(duplicate);
.as-console-wrapper { max-height: 100% !important; top: 0; }