Lodash rimuove i duplicati dall'array


232

Questi sono i miei dati:

[
    {
        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, come posso rimuovere oggetti con chiavi ID duplicate? Qualcosa con filtro, mappa e unico, ma non del tutto sicuro.

Il mio set di dati reali è molto più grande e ha più chiavi, ma il concetto dovrebbe essere lo stesso.

Risposte:


439

_.uniquenon funziona più per la versione corrente poiché lodash 4.0.0 ha questo cambiamento di rottura . Funzionalmente è stato suddiviso in _.uniq, _.sortedUniq, _.sortedUniqBy e _.uniqBy

Puoi usare _.uniqByentrambi

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

o

_.uniqBy(data, 'id');

Documentazione: https://lodash.com/docs#uniqBy


Per le versioni precedenti di lodash (<4.0.0)

Supponendo che i dati debbano essere univoci ide che i dati siano archiviati in datavariabili, è possibile utilizzare la funzione unique () in questo modo:

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

O semplicemente

_.uniq(data, 'id');

1
I documenti lodash 4.0.1 hanno cambiato questo in uniqBy. Non è stato possibile far funzionare l'esempio sopra per la mia vita usando solo uniq.
Will Lovett,

2
Con lodash 4.x, uniq () accetta solo un parametro, che è un array. Quindi, come ha detto @WillLovett, possiamo usare uniqBy () per risolvere questo problema.
ersefuril,

1
Oh ragazzo. Perché, oh perché, è quello uniqche si pronuncia in coda al ginocchio invece di come dovrebbe essere, unique...
Josh M.

56

È possibile utilizzare il metodo lodash _.uniqCon, è disponibile nella versione corrente di lodash 4.17.2.

Esempio:

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 }]

Ulteriori informazioni: https://lodash.com/docs/#uniqWith


6
`let uniqObjects = _.uniqBy (docs, function (e) {return ex + ey;}); `Questo metodo sarà più veloce per le grandi matrici con oggetti semplici
tagplus5

2
sì, ma devi passare un attributo come primo argomento con uniqBy, il che non è conveniente se lo desideri univoco in base a diversi attributi che non conosci già
dbrrt

10

O semplicemente usa l' unione , per un array semplice.

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

// [1,2,3,5]

1
Mi piace questa risposta. Non è il più leggibile, ma funziona davvero se ci pensi da una prospettiva matematica. _.union([1, 2, 2, 1, 3]) => [1, 2, 3]
Sepehr,

5

Usa semplicemente _.uniqBy () . Crea una versione senza duplicati di un array.

Questo è un nuovo modo e disponibile dalla versione 4.0.0.

_.uniqBy(data, 'id');

o

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



1

Per un array semplice, hai l'approccio sindacale, ma puoi anche usare:

_.uniq([2, 1, 2]);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.