¿Cómo crear una lista de elementos únicos en JavaScript?

En mi función de reducción CouchDB necesito reducir una lista de elementos a los únicos.

Nota: En ese caso, está bien tener una lista, será un número pequeño de elementos de tipo cadena.

Mi forma actual es establecer las claves de un objeto, luego devolver las claves de ese objeto ya que el lugar donde el código no puede usar cosas como _.uniq por ejemplo.

Me gustaría encontrar una forma más elegante de deletrear esto.

 function(keys, values, rereduce) { // values is a Array of Arrays values = Array.concat.apply(null, values); var uniq = {}; values.forEach(function(item) { uniq[item] = true; }); return Object.keys(uniq); } 

7 Solutions collect form web for “¿Cómo crear una lista de elementos únicos en JavaScript?”

Comúnmente, el enfoque que usaste es una buena idea. Pero podría proponer una solución que haga que el algoritmo sea mucho más rápido.

 function unique(arr) { var u = {}, a = []; for(var i = 0, l = arr.length; i < l; ++i){ if(!u.hasOwnProperty(arr[i])) { a.push(arr[i]); u[arr[i]] = 1; } } return a; } 

Como pueden ver, aquí solo tenemos un bucle.

He hecho un ejemplo que prueba tus soluciones y las mías. Intenta jugar con eso.

Una alternativa adecuada para listas pequeñas sería simular el enfoque de sort | uniq de la línea de comando de Unix sort | uniq sort | uniq :

  function unique(a) { return a.sort().filter(function(value, index, array) { return (index === 0) || (value !== array[index-1]); }); } 

Esta función ordena el argumento y luego filtra el resultado para omitir cualquier elemento que sea igual a su predecesor.

El enfoque basado en claves está bien y tendrá mejores características de rendimiento para grandes cantidades de elementos (O (n) para insertar n elementos en una tabla hash, en comparación con O (n log n) para clasificar la matriz). Sin embargo, es poco probable que esto se note en pequeñas listas. Además, con esta versión podría modificarla para usar una función de clasificación o igualdad diferente si fuera necesario; con las claves hash estás atascado con la noción de igualdad de claves de JavaScripts

El mejor método parece estar usando ES6 y Set. Línea única y más rápida * que la anterior según el violín.

 const myList = [1,4,5,1,2,4,5,6,7]; const unique = [...new Set(myList)]; console.log(unique); 

Esto debería funcionar con cualquier cosa, no solo con cadenas:

 export const getUniqueList = (a: Array) : Array => { const set = new Set(); for(let v of a){ set.add(v); } return Array.from(set); }; 

Lo anterior solo se puede reducir a:

 export const getUniqueValues = (a: Array) => { return Array.from(new Set(a)); }; 

🙂

Esta es una vieja pregunta, lo sé. Sin embargo, se encuentra en la parte superior de algunas búsquedas en Google, así que quise agregar que puede combinar las respuestas de @RobHague y @EugeneNaydenov utilizando lo siguiente:

 function unique(arr) { const u = {}; return arr.filter((v) => { return u[v] = !u.hasOwnProperty(v); }); }; 

También puede ignorar valores no definidos (a menudo útil) agregando:

 function unique(arr) { const u = {}; return arr.filter((v) => { return u[v] = (v !== undefined && !u.hasOwnProperty(v)); }); }; 

Puedes jugar con esta solución aquí: https://jsfiddle.net/s8d14v5n/

El uso de Object.keys te dará cadenas si pones en argumentos enteros (uniq ([1,2,3]) => [‘1’, ‘2’, ‘3’]. Aquí hay uno con Array.reduce:

 function uniq(list) { return list.reduce((acc, d) => acc.includes(d) ? acc : acc.concat(d), []); } 

qué pasa

  function unique(list) { for (i = 0; i 
  • JavaScript: Arrays. ¿Por qué la concatenación de una matriz vacía con una matriz poblada da como resultado una cadena?
  • ¿Hay una forma 'más corta' de definir una list de, por ejemplo, 100 nuevas matrices?
  • ¿Hay alguna manera de usar map () en una matriz en order inverso con javascript?
  • Declaración de matriz rápida de Javascript
  • ¿Javascript array.forEach atraviesa elementos en order ascendente?
  • ¿Cómo implementan los browseres modernos JS Array, específicamente agregando elementos?
  • ¿Cómo eliminar varias properties de un Objeto con una sola eliminación?
  • Consumo de memory de matrices dispersas en Node.js
  • Slice Array en una matriz de matrices
  • Compatibilidad del browser del constructor Blob
  • ¿Una forma elegante de encontrar subcampos contiguos dentro de una matriz en JavaScript?
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.