Tengo una matriz [1,1,1,1,2,3,4,5,5,6,7,8,8,8]

¿Cómo puedo obtener una matriz de los duplicados distintos [1,5,8]? Cada duplicado en el resultado solo una vez, independientemente de cuántas veces aparezca en la matriz original

Mi código:

var types = availControls.map(item => item.type);
var sorted_types = types.slice().sort();

availControlTypes = [];
for (var i = 0; i < sorted_types.length - 1, i++) {
   if (sorted_types[i + 1] == sorted_types[i])
   availControlTypes.push(sorted_types[i]);
}

Esto me da los duplicados, pero no únicos.

2
full-stack 28 oct. 2019 a las 23:43

4 respuestas

La mejor respuesta

Esto lo hará

var input = [1, 1, 1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 8];

let filterDuplicates = arr => [...new Set(arr.filter((item, index) => arr.indexOf(item) != index))]


console.log(filterDuplicates(input)) 
1
Mike Ezzati 28 oct. 2019 a las 20:59

Necesita un bucle for, con un objeto que contendrá el número de veces que el número apareció en la matriz. Cuando el recuento ya es 1, podemos agregar el elemento al resultado. Deberíamos continuar incrementando el contador, por lo que no agregaremos más de un solo duplicado del mismo número (aunque podemos detenernos en 2).

function fn(arr) {
  var counts = {};
  var result = [];
  var n;
  
  for(var i = 0; i < arr.length; i++) {
    n = arr[i]; // get the current number
    
    if(counts[n] === 1) result.push(n); // if counts is exactly 1, we should add the number to results
    
    counts[n] = (counts[n] || 0) +1; // increment the counter
  }
  
  return result;
}

var arr = [1, 1, 1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 8];

var result = fn(arr);

console.log(result)
1
Ori Drori 28 oct. 2019 a las 20:51

ES6 1 liner. Esto es muy similar a cómo encontramos valores únicos, excepto que en lugar de filtrar las primeras ocurrencias, estamos filtrando las segundas ocurrencias.

let nthOccurrences = (a, n = 1) => a.filter((v, i) => a.filter((vv, ii) => vv === v && ii <= i).length === n);

let x = [1, 1, 1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 8];

let uniques = nthOccurrences(x, 1);
let uniqueDuplicates = nthOccurrences(x, 2);
let uniqueTriplets = nthOccurrences(x, 3); // unique values with 3 or more occurrences

console.log(JSON.stringify(uniques));
console.log(JSON.stringify(uniqueDuplicates));
console.log(JSON.stringify(uniqueTriplets));
0
junvar 28 oct. 2019 a las 21:01
const dupes = arr =>
  Array.from(
    arr.reduce((acc, item) => {
      acc.set(item, (acc.get(item) || 0) + 1);
      return acc;
    }, new Map())
  )
    .filter(x => x[1] > 1)
    .map(x => x[0]);

const arr = [1, 1, 1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 8];

console.log(dupes(arr));

// [ 1, 5, 8 ]
0
Hero Qu 28 oct. 2019 a las 21:00