Saya memiliki jenis array ini:
var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];
Saya ingin memfilternya agar memiliki:
var bar = [ { "a" : "1" }, { "b" : "2" }];
Saya mencoba menggunakan _.uniq, tapi saya rasa karena { "a" : "1" }
tidak sama dengan dirinya sendiri, itu tidak berhasil. Apakah ada cara untuk memberikan garis bawah uniq dengan fungsi yang sama dengan yang diganti?
javascript
json
underscore.js
plus-
sumber
sumber
{ "a" : "2" }
ada? Jika demikian, apakah atribut atau nilai yang membuatnya unik?Jawaban:
.uniq / .unique menerima panggilan balik
Catatan:
Contoh lain: menggunakan callback untuk mengekstrak merek mobil, warna dari daftar
sumber
false
tidak diperlukan untuk_.uniq()
. Juga di lodash Anda bisa menulisnya seperti ini_.uniq(a, 'a');
, karena itu akan menarik propertia
pada objek._.uniq(a, false, 'a')
) Saya melakukan ping ke github / bestiejs / lodash dan mereka mengatakan bahwa masalah telah diperbaiki. Jadi jika Anda tidak menggunakan suatu fungsi, pastikan Anda memiliki yang terbaru. Ini mungkin bukan masalah untuk garis bawah.Jika Anda ingin menghapus duplikat berdasarkan id, Anda dapat melakukan sesuatu seperti ini:
sumber
Date
. Namun demikian.Implementasi jawaban Shiplu.
sumber
JSON.parse(x[0]).a
karena x bukanlah array objek, itu adalah array string. Selain itu, jika Anda menambahkan nilai b ke keunikan dan membalik urutan a / b, nilai tersebut tidak lagi dianggap unik oleh fungsi Anda. (mis. `" {\ "a \": \ "1 \", \ "b \": 2} "! =" {\ "b \": 2, \ "a \": \ "1 \"} ") Mungkin saya melewatkan sesuatu, tetapi bukankah seharusnya hasilnya setidaknya berguna? Berikut adalah jsbin untuk menggambarkan jsbin.com/utoruz/2/edita
untuk setiap objek, ketika mungkin ada objek duplikat yang tidak berisi kunci tersebuta
. Namun, akan masuk akal jikaa
itu adalah id unik.(a ==(=) b when a = b = {a:1})
. Inti dari jawaban saya adalah iterator. Kucoba menjawab tanpa khawatir motifnya, mana bisa apa saja kan? (mis. mungkin mereka ingin mengekstrak daftar merek , warna dari daftar mobil dalam sebuah pertunjukan. jsbin.com/evodub/2/edit ) Cheers!iterator
Ketika saya memiliki id atribut, ini adalah cara favorit saya di garis bawah:
sumber
Menggunakan garis bawah lib unik berikut bekerja untuk saya, saya membuat daftar unik berdasarkan _id kemudian mengembalikan nilai String _id:
sumber
Berikut adalah solusi sederhana, yang menggunakan perbandingan objek yang dalam untuk memeriksa duplikat (tanpa beralih ke JSON, yang tidak efisien dan hacky)
Ini menyaring semua elemen jika mereka memiliki duplikat nanti dalam array - sehingga elemen duplikat terakhir disimpan.
Pengujian untuk penggunaan duplikat
_.isEqual
yang melakukan perbandingan mendalam yang dioptimalkan antara dua objek, lihat dokumentasi isEqual garis bawah untuk info selengkapnya.edit: diperbarui untuk digunakan
_.filter
yang merupakan pendekatan yang lebih bersihsumber
Dokumen lodash 4.6.1 memiliki ini sebagai contoh untuk persamaan kunci objek:
_.uniqWith(objects, _.isEqual);
https://lodash.com/docs#uniqWith
sumber
Coba fungsi iterator
Misalnya Anda dapat mengembalikan elemen pertama
sumber
_.uniq(x,function(i){ return i[0]; });
inilah solusi saya (coffeescript):
contoh:
sumber
dengan garis bawah saya harus menggunakan String () dalam fungsi iteratee
sumber
Saya ingin menyelesaikan solusi sederhana ini dengan cara penulisan yang lugas, dengan sedikit beban biaya komputasi ... tetapi bukankah itu solusi yang sepele dengan definisi variabel minimum, bukan?
sumber
Mari kita uraikan ini. Pertama mari kelompokkan item array dengan nilai stringnya
grouped
seperti:Kemudian mari ambil elemen pertama dari setiap grup
bar
seperti:[ { "a" : "1" }, { "b" : "2" } ]
Gabungkan semuanya:
sumber
Anda dapat melakukannya dengan singkat sebagai:
_.uniq(foo, 'a')
sumber