Tengo este tipo de matriz:
var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];
Me gustaría filtrarlo para tener:
var bar = [ { "a" : "1" }, { "b" : "2" }];
Intenté usar _.uniq, pero supongo que porque { "a" : "1" }
no es igual a sí mismo, no funciona. ¿Hay alguna manera de proporcionar subrayado uniq con una función de anulación igual?
{ "a" : "2" }
existen? Si es así, ¿es el atributo o el valor lo que lo hace único?Respuestas:
.uniq / .unique acepta una devolución de llamada
Notas:
Otro ejemplo: usar la devolución de llamada para extraer marcas de automóviles, colores de una lista
fuente
false
no se requiere para_.uniq()
. También en lodash podrías haberlo escrito así_.uniq(a, 'a');
, ya que arrancará la propiedada
de los objetos._.uniq(a, false, 'a')
. Ej. ) Pellizqué github / bestiejs / lodash y dijeron que el problema se solucionó al límite. Entonces, si no está utilizando una función, asegúrese de tener la última. Esto puede no ser un problema para subrayar.Si está buscando eliminar duplicados basados en una identificación, puede hacer algo como esto:
fuente
Date
. Sin embargo esto sí.Implementación de la respuesta de Shiplu.
fuente
JSON.parse(x[0]).a
porque x no es una matriz de objetos, es una matriz de cadenas. Además, si agrega valores b a los únicos e invierte el orden de a / b, su función ya no los considera únicos. (por ejemplo, "{\" a \ ": \" 1 \ ", \" b \ ": 2}"! = "{\" b \ ": 2, \" a \ ": \" 1 \ "} ") Tal vez me estoy perdiendo algo, pero ¿no debería ser útil al menos el resultado? Aquí hay un jsbin para ilustrar jsbin.com/utoruz/2/edita
para cada objeto, cuando podría haber objetos duplicados que no contengan la clavea
. Sin embargo, tendría sentido sia
fuera una identificación única.(a ==(=) b when a = b = {a:1})
. El punto de mi respuesta fue el iterador. Traté de responder sin preocuparme por el motivo, que podría ser cualquier cosa, ¿verdad? (por ejemplo, tal vez querían extraer una lista de marcas, colores de una lista de automóviles en un espectáculo. jsbin.com/evodub/2/edit ) ¡Salud!iterator
Cuando tengo una identificación de atributo, esta es mi forma preferida en guión bajo:
fuente
El uso de guiones únicos de subrayado lib funciona para mí, estoy haciendo una lista única basada en _id y luego devolviendo el valor de cadena de _id:
fuente
Aquí hay una solución simple, que utiliza una comparación profunda de objetos para verificar si hay duplicados (sin recurrir a la conversión a JSON, que es ineficiente y hacky)
Filtra todos los elementos si tienen un duplicado más adelante en la matriz, de modo que se mantenga el último elemento duplicado.
La prueba de un uso duplicado
_.isEqual
que realiza una comparación profunda optimizada entre los dos objetos, consulte la documentación de subrayado isEqual para obtener más información.editar: actualizado para usar,
_.filter
que es un enfoque más limpiofuente
Los documentos de lodash 4.6.1 tienen esto como un ejemplo para la igualdad de clave de objeto:
_.uniqWith(objects, _.isEqual);
https://lodash.com/docs#uniqWith
fuente
Prueba la función iteradora
Por ejemplo, puede devolver el primer elemento
fuente
_.uniq(x,function(i){ return i[0]; });
Aquí está mi solución (coffeescript):
ejemplo:
fuente
con guión bajo tuve que usar String () en la función iteratee
fuente
Quería resolver esta solución simple de una manera sencilla de escribir, con un poco de molestia en los gastos computacionales ... pero ¿no es una solución trivial con una definición mínima variable, verdad?
fuente
Vamos a romper esto. Primero, agrupemos los elementos de la matriz por su valor en cadena
grouped
parece:Luego tomemos el primer elemento de cada grupo
bar
parece:[ { "a" : "1" }, { "b" : "2" } ]
Ponlo todo junto:
fuente
Puedes hacerlo en forma abreviada como:
_.uniq(foo, 'a')
fuente