Lodash menghapus duplikat dari array


232

Ini data saya:

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

Dengan Lodash, bagaimana saya bisa menghapus objek dengan kunci id duplikat? Sesuatu dengan filter, peta dan unik, tetapi tidak yakin.

Kumpulan data saya yang sebenarnya jauh lebih besar dan memiliki lebih banyak kunci, tetapi konsepnya harus sama.

Jawaban:


439

_.uniquetidak lagi berfungsi untuk versi saat ini karena lodash 4.0.0 memiliki perubahan yang melanggar ini . Secara fungsional dibagi menjadi _.uniq, _.sortedUniq, _.sortedUniqBy, & _.uniqBy

Anda bisa menggunakan _.uniqBysalah satunya dengan

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

atau

_.uniqBy(data, 'id');

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


Untuk versi lodash yang lebih lama (<4.0.0)

Dengan asumsi bahwa data harus unik oleh iddan data Anda disimpan dalam datavariabel, Anda dapat menggunakan fungsi unik () seperti ini:

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

Atau sederhananya

_.uniq(data, 'id');

1
Dokumen lodash 4.0.1 telah mengubah ini menjadi unik. Tidak bisa mendapatkan contoh di atas bekerja untuk kehidupan saya hanya menggunakan uniq.
Will Lovett

2
Dengan lodash 4.x, uniq () hanya menerima satu parameter, yang merupakan array. Jadi seperti yang dikatakan @WillLovett, kita bisa menggunakan uniqBy () untuk menyelesaikan masalah ini.
ersefuril

1
Oh Boy. Mengapa, oh mengapa, apakah uniqyang diucapkan sebagai antrian lutut Anda dan bukan apa yang seharusnya, unique...
Josh M.

56

Anda dapat menggunakan metode lodash _.uniqDengan, ini tersedia dalam versi lodash 4.17.2 saat ini.

Contoh:

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

Info lebih lanjut: https://lodash.com/docs/#uniqWith


6
`let uniqObjects = _.uniqBy (docs, function (e) {return ex + ey;}); `Metode ini akan lebih cepat untuk array besar dengan objek sederhana
tagplus5

2
ya tetapi Anda harus memberikan atribut sebagai argumen pertama dengan uniqBy, yang tidak nyaman jika Anda menginginkannya unik berdasarkan beberapa atribut yang belum Anda ketahui
dbrrt

10

Atau cukup Gunakan gabungan , untuk array sederhana.

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

// [1,2,3,5]

1
Saya suka jawaban ini. Ini bukan yang paling mudah dibaca, tapi itu benar-benar berfungsi jika Anda memikirkannya dari perspektif matematika. _.union([1, 2, 2, 1, 3]) => [1, 2, 3]
Sepehr

5

Cukup gunakan _.uniqBy () . Ini menciptakan versi array duplikat-bebas.

Ini adalah cara baru dan tersedia dari versi 4.0.0.

_.uniqBy(data, 'id');

atau

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


1

Anda juga dapat menggunakan unionBy untuk 4.0.0 dan yang lebih baru, sebagai berikut: let uniques = _.unionBy (data, 'id')


1

Untuk larik sederhana, Anda memiliki pendekatan gabungan, tetapi Anda juga dapat menggunakan:

_.uniq([2, 1, 2]);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.