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.

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

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


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]

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);

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



1

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

_.uniq([2, 1, 2]);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.