Lodash elimina duplicados de la matriz


232

Esta es mi información:

[
    {
        url: 'www.example.com/hello',
        id: "22"    
    },
    {
        url: 'www.example.com/hello',
        id: "22"    
    },
    {
        url: 'www.example.com/hello-how-are-you',
        id: "23"    
    },
    {
        url: 'www.example.com/i-like-cats',
        id: "24"    
    },
    {
        url: 'www.example.com/i-like-pie',
        id: "25"    
    }
]

Con Lodash, ¿cómo podría eliminar objetos con claves de identificación duplicadas? Algo con filtro, mapa y único, pero no del todo seguro.

Mi conjunto de datos real es mucho más grande y tiene más claves, pero el concepto debería ser el mismo.

Respuestas:


439

_.uniqueya no funciona para la versión actual ya que lodash 4.0.0 tiene este cambio radical . El funcionalmente se dividió en _.uniq, _.sortedUniq, _.sortedUniqBy, y _.uniqBy

Podrías usar _.uniqBycualquiera de

_.uniqBy(data, function (e) {
  return e.id;
});

o

_.uniqBy(data, 'id');

Documentación: https://lodash.com/docs#uniqBy


Para versiones anteriores de lodash (<4.0.0)

Suponiendo que los datos sean únicos idy que sus datos estén almacenados en datavariables, puede usar la función unique () de esta manera:

_.unique(data, function (e) {
  return e.id;
});

O simplemente

_.uniq(data, 'id');

1
Los documentos de lodash 4.0.1 han cambiado esto a uniqBy. No pude hacer que el ejemplo anterior funcione para mi vida usando solo uniq.
Will Lovett

2
Con lodash 4.x, uniq () acepta solo un parámetro, que es una matriz. Entonces, como dijo @WillLovett, podemos usar uniqBy () para resolver este problema.
ersefuril

1
Oh chico. ¿Por qué, oh por qué, es lo uniqque se pronuncia cola de rodilla en lugar de lo que debería ser, unique...
Josh M.

56

Puede usar el método lodash _.uniqWith, está disponible en la versión actual de lodash 4.17.2.

Ejemplo:

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];

_.uniqWith(objects, _.isEqual);
// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]

Más información: https://lodash.com/docs/#uniqWith


66
`let uniqObjects = _.uniqBy (docs, function (e) {return ex + ey;}); `Este método será más rápido para grandes matrices con objetos simples
tagplus5

2
sí, pero debe pasar un atributo como primer argumento con uniqBy, lo cual no es conveniente si lo desea de forma única en función de varios atributos que aún no conoce
dbrrt el

10

O simplemente use union , para una matriz simple.

_.union([1,2,3,3], [3,5])

// [1,2,3,5]

1
Me gusta esta respuesta No es el más legible, pero en realidad funciona si lo piensas desde una perspectiva matemática. _.union([1, 2, 2, 1, 3]) => [1, 2, 3]
Sepehr

5

Simplemente use _.uniqBy () . Crea una versión libre de duplicados de una matriz.

Esta es una nueva forma y está disponible desde la versión 4.0.0.

_.uniqBy(data, 'id');

o

_.uniqBy(data, obj => obj.id);

4

Con la versión 4+ de lodash, eliminaría objetos duplicados por propiedad específica o por todo el objeto de la siguiente manera:

var users = [
  {id:1,name:'ted'},
  {id:1,name:'ted'},
  {id:1,name:'bob'},
  {id:3,name:'sara'}
];
var uniqueUsersByID = _.uniqBy(users,'id'); //removed if had duplicate id
var uniqueUsers = _.uniqWith(users, _.isEqual);//removed complete duplicates

Fuente: https://www.codegrepper.com/?search_term=Lodash+remove+duplicates+from+array



1

Para una matriz simple, tiene el enfoque de unión, pero también puede usar:

_.uniq([2, 1, 2]);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.