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.

ChrisRich
fuente

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');
ntalbs
fuente
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

zdrsoft
fuente
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]
Vixson
fuente
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);
Hassan Ajaz
fuente
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

Taylor Hawkes
fuente
1

También puede usar unionBy para 4.0.0 y posterior, de la siguiente manera: let uniques = _.unionBy (data, 'id')

Himanshu Tanwar
fuente
1

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

_.uniq([2, 1, 2]);
ZettaPal
fuente