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.

ChrisRich
sumber

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

zdrsoft
sumber
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]
Vixson
sumber
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);
Hassan Ajaz
sumber
4

Dengan lodash versi 4+, Anda akan menghapus objek duplikat baik oleh properti tertentu atau seluruh objek seperti:

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

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

Taylor Hawkes
sumber
1

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

Himanshu Tanwar
sumber
1

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

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