Lodash yinelenenleri diziden kaldır


233

Bu benim verilerim:

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

Lodash ile yinelenen kimlik anahtarlarına sahip nesneleri nasıl kaldırabilirim? Filtre, harita ve benzersiz bir şey, ama tam olarak emin değilim.

Gerçek veri setim çok daha büyük ve daha fazla anahtar içeriyor, ancak konsept aynı olmalı.

Yanıtlar:


440

_.uniquemevcut sürüm için artık çalışmaz, çünkü lodash 4.0.0 bu kırılma değişikliğine sahiptir . İşlevsel olarak _.uniq, _.sortedUniq, _.sortedUniqBy, & _.uniqBy olarak ayrıldı

Şunlardan birini kullanabilirsiniz _.uniqBy:

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

veya

_.uniqBy(data, 'id');

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


Lodash'ın eski sürümleri için (<4.0.0)

Verilerin benzersiz olması idve verilerinizin datadeğişkente depolanması gerektiğini varsayarsak, şöyle benzersiz () işlevini kullanabilirsiniz :

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

Ya da sadece

_.uniq(data, 'id');

1
Lodash 4.0.1 belgeleri bunu uniqBy olarak değiştirdi. Yukarıdaki örnek sadece uniq kullanarak benim yaşam için çalışmak için alınamadı.
Lovett

2
Lodash 4.x ile, uniq () bir dizi olan yalnızca bir parametreyi kabul eder. @WillLovett'in dediği gibi, bu sorunu çözmek için uniqBy () kullanabiliriz.
ersefuril

1
Ah oğlum. Neden, oh neden, olması gerektiği yerine diz-kuyruğuuniq olarak telaffuz edilir , ...unique
Josh M.

56

Lodash yöntemini _.uniq kullanabilirsiniz. İle, mevcut lodash 4.17.2 sürümünde kullanılabilir.

Misal:

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

Daha fazla bilgi: https://lodash.com/docs/#uniqWith


6
`uniqObjects = _.uniqBy (docs, function (e) {return ex + ey;}); `Bu yöntem basit nesnelerle büyük diziler için daha hızlı olacak
tagplus5

2
evet ama uniqBy ile ilk argüman olarak bir niteliği iletmeniz gerekiyor, bu zaten bilmediğiniz birkaç özelliğe dayanarak benzersiz olmasını istiyorsanız uygun değildir
dbrrt

10

Veya basit dizi için birleşmeyi kullanın .

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

// [1,2,3,5]

1
Bu cevabı beğendim. En okunaklı değil, ama aslında matematik perspektifinden düşünürseniz işe yarıyor. _.union([1, 2, 2, 1, 3]) => [1, 2, 3]
Sepehr

5

Basitçe _.uniqBy () kullanın . Bir dizinin kopyasız sürümünü oluşturur.

Bu yeni bir yoldur ve 4.0.0 sürümünden edinilebilir.

_.uniqBy(data, 'id');

veya

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



1

Basit bir dizi için birleşim yaklaşımınız vardır, ancak şunları da kullanabilirsiniz:

_.uniq([2, 1, 2]);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.