Lodash remove duplicatas da matriz

232

Estes são os meus dados:

[
    {
        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"    
    }
]

Com o Lodash, como remover objetos com chaves de identificação duplicadas? Algo com filtro, mapa e exclusivo, mas não tenho muita certeza.

Meu conjunto de dados real é muito maior e tem mais chaves, mas o conceito deve ser o mesmo.

ChrisRich
fonte

Respostas:

439

_.uniquenão funciona mais para a versão atual, pois o lodash 4.0.0 possui essa alteração de última hora . O funcionalmente foi dividido em _.uniq, _.sortedUniq, _.sortedUniqBy e _.uniqBy

Você pode usar _.uniqBytanto por

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

ou

_.uniqBy(data, 'id');

Documentação: https://lodash.com/docs#uniqBy


Para versões mais antigas do lodash (<4.0.0)

Supondo que os dados devam ser exclusivos ide seus dados estejam armazenados em datavariável, você pode usar a função unique () como esta:

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

Ou simplesmente

_.uniq(data, 'id');
ntalbs
fonte
1
Os documentos do lodash 4.0.1 mudaram isso para uniqBy. Não foi possível obter o exemplo acima para trabalhar pela minha vida usando apenas uniq.
Will Lovett
2
Com o lodash 4.x, o uniq () aceita apenas um parâmetro, que é uma matriz. Assim como o @WillLovett disse, podemos usar o uniqBy () para resolver esse problema.
Ef ef
1
Oh garoto. Por que, oh por que, é uniqque é pronunciado você-knee-fila em vez do que deveria ser, unique...
Josh M.
56

Você pode usar o método lodash _.uniqWith, ele está disponível na versão atual do lodash 4.17.2.

Exemplo:

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

Mais informações: https://lodash.com/docs/#uniqWith

zdrsoft
fonte
6
`let uniqObjects = _.uniqBy (documentos, função (e) {return ex + ey;}); `Este método será mais rápido para grandes matrizes com objetos simples
tagplus5
2
sim, mas você tem que passar por um atributo como primeiro argumento com uniqBy, que não é conveniente se você quer que ele única, baseada em vários atributos que você ainda não conhece
dbrrt
10

Ou simplesmente Use union , para matriz simples.

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

// [1,2,3,5]
Vixson
fonte
1
Eu gosto desta resposta. Não é o mais legível, mas na verdade funciona se você pensar sobre isso da perspectiva da matemática. _.union([1, 2, 2, 1, 3]) => [1, 2, 3]
Sepehr
5

Simplesmente use _.uniqBy () . Ele cria uma versão sem duplicado de uma matriz.

Esta é uma nova maneira e está disponível na versão 4.0.0.

_.uniqBy(data, 'id');

ou

_.uniqBy(data, obj => obj.id);
Hassan Ajaz
fonte
4

Com o lodash versão 4+, você removia objetos duplicados por propriedade específica ou por todo o objeto da seguinte maneira:

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

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

Taylor Hawkes
fonte
1

Você também pode usar unionBy para 4.0.0 e posterior, da seguinte maneira: let uniques = _.unionBy (data, 'id')

Himanshu Tanwar
fonte
1

Para uma matriz simples, você tem a abordagem de união, mas também pode usar:

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