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.