Saya memiliki objek yang berisi array objek.
things = new Object();
things.thing = new Array();
things.thing.push({place:"here",name:"stuff"});
things.thing.push({place:"there",name:"morestuff"});
things.thing.push({place:"there",name:"morestuff"});
Saya bertanya-tanya apa metode terbaik untuk menghapus objek duplikat dari array. Jadi misalnya, segalanya akan menjadi ...
{place:"here",name:"stuff"},
{place:"there",name:"morestuff"}
javascript
arrays
object
duplicates
Travis
sumber
sumber
aaaaa.aaaa.push(...)
:)Jawaban:
Metode primitif adalah:
sumber
Bagaimana dengan
es6
sihir?URL referensi
Solusi yang lebih umum adalah:
Contoh Stackblitz
sumber
things.thing = things.thing.filter((thing, index, self) => self.findIndex(t => t.place === thing.place && t.name === thing.name) === index)
const uniqueArray = arrayOfObjects.filter((object,index) => index === arrayOfObjects.findIndex(obj => JSON.stringify(obj) === JSON.stringify(object)));
jsfiddle.net/x9ku0p7L/28Jika Anda dapat menggunakan pustaka Javascript seperti garis bawah atau lodash, saya sarankan melihat
_.uniq
fungsi di pustaka mereka. Darilodash
:Pada dasarnya, Anda meneruskan dalam array yang di sini adalah objek literal dan Anda meneruskan atribut yang ingin Anda hapus duplikat dengan dalam array data asli, seperti ini:
UPDATE : Lodash sekarang telah memperkenalkan
.uniqBy
juga.sumber
uniqBy
alih-alihuniq
, misalnya_.uniqBy(data, 'name')
... dokumentasi: lodash.com/docs#uniqBySaya memiliki persyaratan yang sama persis ini, untuk menghapus objek duplikat dalam array, berdasarkan duplikat pada satu bidang. Saya menemukan kode di sini: Javascript: Hapus Duplikat dari Array Objek
Jadi dalam contoh saya, saya menghapus objek apa pun dari array yang memiliki nilai string licenseNum duplikat.
Hasil:
uniqueArray adalah:
sumber
for(var i in array) { if(array[i][prop]){ //valid lookupObject[array[i][prop]] = array[i]; } else { console.log('falsy object'); } }
for (let i in originalArray) { if (lookupObject[originalArray[i]['id']] === undefined) { newArray.push(originalArray[i]); } lookupObject[originalArray[i]['id']] = originalArray[i]; }
Satu liner terpendek untuk ES6 +
Temukan unik
id
dalam array.Unik oleh beberapa properti (
place
danname
)Unik oleh semua properti (Ini akan lambat untuk array besar)
Pertahankan kejadian terakhir.
sumber
Satu liner menggunakan Set
Penjelasan:
new Set(myData.map(JSON.stringify))
menciptakan Set objek menggunakan elemen myData stringified.sumber
Menggunakan ES6 + dalam satu baris Anda bisa mendapatkan daftar objek unik dengan kunci:
Itu dapat dimasukkan ke dalam fungsi:
Berikut ini contoh kerjanya:
bagaimana cara kerjanya
Pertama array ini dipetakan ulang sedemikian rupa sehingga dapat digunakan sebagai input untuk Peta.
yang berarti setiap item array akan ditransformasikan dalam array lain dengan 2 elemen; tombol yang dipilih sebagai elemen pertama dan seluruh item awal sebagai elemen kedua, ini disebut entri (mis. entri array , entri peta ). Dan sini adalah dokumen resmi dengan contoh yang menunjukkan cara menambahkan entri array di konstruktor Peta.
Contoh ketika kunci ditempatkan :
Kedua, kami meneruskan array yang dimodifikasi ini ke konstruktor Peta dan inilah keajaiban yang terjadi. Peta akan menghilangkan nilai kunci duplikat, menjaga hanya nilai yang dimasukkan terakhir dari kunci yang sama. Catatan : Peta menjaga urutan penyisipan. ( periksa perbedaan antara Peta dan objek )
Ketiga, kami menggunakan nilai peta untuk mengambil item asli, tapi kali ini tanpa duplikat.
Dan yang terakhir adalah menambahkan nilai-nilai itu ke dalam array baru yang baru sehingga dapat terlihat sebagai struktur awal dan mengembalikannya:
sumber
id
. Pertanyaan ini membutuhkan seluruh objek menjadi unik di semua bidang sepertiplace
danname
Berikut opsi lain untuk melakukannya menggunakan metode pengulangan Array jika Anda hanya perlu membandingkan dengan satu bidang objek:
sumber
satu liner ada di sini
sumber
Jika Anda bisa menunggu untuk menghilangkan duplikat sampai setelah semua penambahan, pendekatan khasnya adalah mengurutkan array terlebih dahulu dan kemudian menghilangkan duplikat. Penyortiran menghindari pendekatan N * N memindai array untuk setiap elemen saat Anda berjalan melalui mereka.
The "menghilangkan duplikasi" fungsi biasanya disebut unik atau uniq . Beberapa implementasi yang ada dapat menggabungkan dua langkah, misalnya, uniq prototipe
Posting ini memiliki beberapa ide untuk dicoba (dan beberapa untuk menghindari :-)) jika perpustakaan Anda belum memilikinya ! Secara pribadi saya menemukan ini yang paling mudah:
sumber
function(_a,_b){return _a.a===_b.a && _a.b===_b.b;}
maka array tidak akan diurutkan.Cara paling sederhana adalah menggunakan
filter
:sumber
id
. Pertanyaan ini membutuhkan seluruh objek menjadi unik di semua bidang sepertiplace
danname
Ini adalah cara umum untuk melakukan ini: Anda meneruskan fungsi yang menguji apakah dua elemen array dianggap sama. Dalam hal ini, ia membandingkan nilai-nilai
name
danplace
properti dari dua objek yang dibandingkan.Jawaban ES5
Jawaban ES3 asli
sumber
Untuk menambahkan satu lagi ke daftar. Menggunakan ES6 dan
Array.reduce
denganArray.find
.Dalam contoh ini, memfilter objek berdasarkan
guid
properti.Memperluas yang ini untuk memungkinkan pemilihan properti dan kompres menjadi satu liner:
Untuk menggunakannya, lewati array objek dan nama kunci yang ingin Anda hapus sebagai nilai string:
sumber
Anda juga dapat menggunakan
Map
:Sampel lengkap:
Hasil:
sumber
Sial, anak-anak, ayo hancurkan benda ini, kenapa kita tidak?
sumber
id
. Pertanyaan ini membutuhkan seluruh objek menjadi unik di semua bidang sepertiplace
danname
place
danname
hari ini. Siapa pun yang membaca utas ini sedang mencari cara optimal untuk mendeduksi daftar objek, dan ini adalah cara ringkas untuk melakukannya.Solusi TypeScript
Ini akan menghapus objek duplikat dan juga melestarikan jenis objek.
sumber
Mengingat
lodash.uniqWith
sumber
Pilihan lain adalah membuat fungsi indexOf kustom, yang membandingkan nilai properti yang Anda pilih untuk setiap objek dan membungkusnya dalam fungsi pengurangan.
sumber
lodash.isequal
paket npm sebagai pembanding objek ringan untuk melakukan penyaringan array yang unik ... misalnya array objek yang berbeda. Baru saja bertukar danif (_.isEqual(a[i], b)) {
bukannya mencari @ properti tunggalSatu-liner menggunakan ES6 dan
new Map()
.Detail: -
.map()
pada daftar data dan mengubah masing-masing objek menjadi[key, value]
array pasangan (panjang = 2), elemen pertama (kunci) akan menjadistringified
versi objek dan yang kedua (nilai) akan menjadiobject
dirinya sendiri.new Map()
akan memiliki kunci sebagaistringified
objek dan penambahan kunci yang sama akan mengakibatkan menimpa kunci yang sudah ada..values()
akan memberi MapIterator dengan semua nilai dalam Peta (obj
dalam kasus kami)spread ...
operator memberikan Array baru dengan nilai dari langkah di atas.sumber
Ini adalah solusi untuk es6 di mana Anda hanya ingin menyimpan item terakhir. Solusi ini fungsional dan sesuai dengan gaya Airbnb.
sumber
removeDuplicates () mengambil dalam array objek dan mengembalikan array baru tanpa objek duplikat (berdasarkan properti id).
Hasil yang diharapkan:
Pertama, kita menetapkan nilai variabel uniq ke objek kosong.
Selanjutnya, kami memfilter melalui array objek. Filter membuat array baru dengan semua elemen yang lulus tes diimplementasikan oleh fungsi yang disediakan.
Di atas, kami menggunakan fungsi hubungan singkat &&. Jika sisi kiri && dievaluasi ke true, maka ia mengembalikan nilai di sebelah kanan &&. Jika sisi kiri salah, ia mengembalikan apa yang ada di sisi kiri &&.
Untuk setiap objek (obj) kami memeriksa uniq untuk sebuah properti bernama nilai obj.id (Dalam hal ini, pada iterasi pertama ia akan memeriksa properti '1'.) Kami ingin kebalikan dari apa yang dikembalikan (baik benar atau salah) yang mengapa kami menggunakan! di! uniq [obj.id]. Jika uniq sudah memiliki properti id, ia mengembalikan true yang mengevaluasi false (!) Memberitahu fungsi filter TIDAK untuk menambahkan objek itu. Namun, jika tidak menemukan properti obj.id, ia mengembalikan false yang kemudian dievaluasi menjadi true (!) Dan mengembalikan semuanya ke kanan &&, atau (uniq [obj.id] = true). Ini adalah nilai kebenaran, memberi tahu metode filter untuk menambahkan objek ke array yang dikembalikan, dan juga menambahkan properti {1: true} ke uniq. Ini memastikan bahwa instance obj lain dengan id yang sama tidak akan ditambahkan lagi.
sumber
sumber
Saya percaya kombinasi
reduce
denganJSON.stringify
untuk membandingkan Objek secara sempurna dan secara selektif menambahkan mereka yang belum berada di akumulator adalah cara yang elegan.Perlu diingat bahwa
JSON.stringify
mungkin menjadi masalah kinerja dalam kasus ekstrim di mana array memiliki banyak Objek dan mereka kompleks, TAPI untuk sebagian besar waktu , ini adalah cara terpendek untuk pergi IMHO.Cara penulisan yang sama (tapi kurang efisien):
sumber
Terus mengeksplorasi cara-cara ES6 untuk menghapus duplikat dari berbagai objek: menetapkan
thisArg
argumenArray.prototype.filter
untuknew Set
memberikan alternatif yang layak:Namun, itu tidak akan berfungsi dengan fungsi panah
() =>
, karenathis
terikat dengan ruang lingkup leksikal mereka.sumber
es6 magic dalam satu baris ... dapat dibaca pada saat itu!
sumber
Solusi sederhana dengan metode bantu pengurangan ES6 'Perkecil' dan 'Temukan'
Bekerja dengan efisien dan sangat baik!
sumber
Jika Anda tidak keberatan array unik Anda diurutkan setelahnya, ini akan menjadi solusi yang efisien:
Dengan cara ini, Anda hanya perlu membandingkan elemen saat ini dengan elemen sebelumnya dalam array. Mengurutkan sekali sebelum memfilter (
O(n*log(n))
) lebih murah daripada mencari duplikat di seluruh array untuk setiap elemen array (O(n²)
).sumber
Ini adalah cara sederhana cara menghapus duplikat dari berbagai objek.
Saya banyak bekerja dengan data dan ini berguna bagi saya.
akan dicetak ke konsol:
sumber
str adalah array objek. Ada objek yang memiliki nilai yang sama (di sini contoh kecil, ada dua objek yang memiliki item_id sama dengan 2). check (id) adalah fungsi yang memeriksa apakah ada objek yang memiliki item_id yang sama ada atau tidak. jika ada return false jika tidak return true. Menurut hasil itu, mendorong objek ke array baru obj Output dari kode di atas adalah
[{"item_id":1},{"item_id":2}]
sumber
Pernahkah Anda mendengar tentang perpustakaan Lodash? Saya sarankan Anda utilitas ini, ketika Anda tidak benar-benar ingin menerapkan logika Anda ke kode, dan gunakan kode yang sudah ada yang dioptimalkan dan dapat diandalkan.
Pertimbangkan untuk membuat array seperti ini
Perhatikan bahwa jika Anda ingin membuat satu atribut unik, Anda dapat melakukannya dengan menggunakan pustaka lodash. Di sini, Anda dapat menggunakan _.uniqBy
Metode ini seperti _.uniq (yang mengembalikan versi bebas duplikat dari array, di mana hanya kejadian pertama dari setiap elemen disimpan) kecuali bahwa ia menerima iteratee yang dipanggil untuk setiap elemen dalam array untuk menghasilkan kriteria yang dengannya Keunikan dihitung.
Jadi, misalnya, jika Anda ingin mengembalikan array yang memiliki atribut unik 'tempat'
Demikian pula, jika Anda ingin atribut unik sebagai 'nama'
Semoga ini membantu.
Bersulang!
sumber