Saya perlu memeriksa array JavaScript untuk melihat apakah ada nilai duplikat. Apa cara termudah untuk melakukan ini? Saya hanya perlu menemukan nilai duplikatnya - Saya sebenarnya tidak membutuhkan indeks mereka atau berapa kali mereka digandakan.
Saya tahu saya bisa mengulang array dan memeriksa semua nilai lainnya untuk kecocokan, tetapi sepertinya harus ada cara yang lebih mudah.
Pertanyaan serupa:
javascript
arrays
Scott Saunders
sumber
sumber
Jawaban:
Anda bisa mengurutkan array dan kemudian menjalankannya lalu melihat apakah indeks berikutnya (atau sebelumnya) sama dengan saat ini. Dengan asumsi algoritma pengurutan Anda baik, ini harus kurang dari O (n 2 ):
Dalam hal ini, jika Anda kembali sebagai fungsi untuk duplikat. Ini untuk jenis case yang serupa.
Referensi: https://stackoverflow.com/a/57532964/8119511
sumber
arr = [9, 9, 9, 111, 2, 3, 3, 3, 4, 4, 5, 7];
i++
. Sebaliknya, mereka mengatakan tidak menulisj = i + +j
. Dua hal yang berbeda IMHO. Saya pikiri += 1
ini lebih membingungkan daripada yang sederhana dan indahi++
:)var sorted_arr = arr.sort()
tidak berguna:arr.sort()
mengubah array asli (yang merupakan masalah dengan sendirinya). Ini juga membuang elemen. (Jalankan kode di atas. Apa yang terjadi pada 9?) Cc @dystroy Solusi yang lebih bersih adalahresults = arr.filter(function(elem, pos) { return arr.indexOf(elem) == pos; })
Jika Anda ingin menghilangkan duplikat, coba solusi hebat ini:
Sumber: http://dreaminginjavascript.wordpress.com/2008/08/22/eliminating-duplicates/
sumber
Ini jawaban saya dari utas rangkap (!):
Saat menulis entri ini 2014 - semua contoh adalah untuk loop atau jQuery. Javascript memiliki alat yang sempurna untuk ini: mengurutkan, memetakan dan mengurangi.
Temukan item duplikat
Sintaks yang lebih fungsional:
@ Dmytro-Laptin menunjukkan beberapa kode kode dihapus. Ini adalah versi yang lebih ringkas dari kode yang sama. Menggunakan beberapa trik ES6 dan fungsi urutan yang lebih tinggi:
sumber
Temukan nilai duplikat dalam array
Ini harus menjadi salah satu cara terpendek untuk benar-benar menemukan nilai duplikat dalam array. Seperti yang secara khusus diminta oleh OP, ini tidak menghapus duplikat tetapi menemukannya .
Ini tidak perlu disortir atau kerangka kerja pihak ketiga. Itu juga tidak perlu loop manual. Ia bekerja dengan setiap indexOf nilai () (atau lebih jelas: operator perbandingan ketat ) mendukung.
Karena mengurangi () dan indexOf () diperlukan setidaknya IE 9.
sumber
const dupes = items.reduce((acc, v, i, arr) => arr.indexOf(v) !== i && acc.indexOf(v) === -1 ? acc.concat(v) : acc, [])
Anda dapat menambahkan fungsi ini, atau men-tweak dan menambahkannya ke prototipe Array Javascript:
sumber
DIPERBARUI: Berikut ini menggunakan strategi gabungan yang dioptimalkan. Ini mengoptimalkan pencarian primitif untuk mendapatkan keuntungan dari hash O (1) waktu pencarian (berjalan
unique
pada array primitif adalah O (n)). Pencarian objek dioptimalkan dengan menandai objek dengan id unik saat iterasi melalui sehingga mengidentifikasi objek duplikat juga O (1) per item dan O (n) untuk seluruh daftar. Satu-satunya pengecualian adalah item yang dibekukan, tetapi itu jarang dan fallback disediakan menggunakan array dan indexOf.Jika Anda memiliki Koleksi ES6, maka ada versi yang jauh lebih sederhana dan jauh lebih cepat. (shim untuk IE9 + dan browser lain di sini: https://github.com/Benvie/ES6-Harmony-Collections-Shim )
sumber
DIPERBARUI: Short one-liner untuk mendapatkan duplikat:
Untuk mendapatkan array tanpa duplikat, cukup membalikkan kondisinya:
Saya sama sekali tidak memikirkan
filter()
jawaban lama saya di bawah;)Ketika semua yang Anda butuhkan adalah memeriksa bahwa tidak ada duplikat seperti yang ditanyakan dalam pertanyaan ini, Anda dapat menggunakan
every()
metode ini:Catatan yang
every()
tidak berfungsi untuk IE 8 dan di bawah.sumber
sumber
'a'
dalam array, fungsi filter di dalamindex == 1
, sedangkanself.indexOf('a') == 0
Ini akan memberi Anda apa yang Anda inginkan, Hanya duplikatnya.
sumber
menggunakan underscore.js
sumber
ES2015
Temukan nilai unik dari 3 array (atau lebih):
Hanya polyfill untuk indeks arrayOf untuk browser lama:
Solusi jQuery menggunakan "inArray":
alih-alih menambahkan
Array.prototype.indexOf
sumber
var r = [];
agar kode Anda berfungsi. Dan bekerja seperti pesona.r
variabelBerikut ini adalah solusi sederhana saya dan satu jalur.
Ia mencari bukan elemen unik terlebih dahulu, kemudian membuat array yang ditemukan unik dengan penggunaan Set.
Jadi kami memiliki array duplikat pada akhirnya.
sumber
Ini proposal saya (ES6):
sumber
undefined
adalah duplikat.atau ketika ditambahkan ke prototyp.chain Array
Lihat di sini: https://gist.github.com/1305056
sumber
i&&
untuk menghindari keluar dari batas array, tetapi juga berarti bahwa elemen pertama dalam array yang diurutkan tidak akan dimasukkan. Dalam contoh Anda tidak ada1
dalam array yang dihasilkan. Yaitureturn i&&v!==o[i-1]?v:0;
harusreturn v!==o[i-1];
Cara cepat dan elegan menggunakan es6 objek yang merusak dan mengurangi
Ini berjalan di O (n) (1 iterasi di atas array) dan tidak mengulangi nilai yang muncul lebih dari 2 kali
sumber
Inilah solusi paling sederhana yang dapat saya pikirkan:
Itu dia.
catatan:
Ini berfungsi dengan angka apa pun termasuk
0
, misalnya string dan angka negatif-1
- Pertanyaan terkait: Dapatkan semua nilai unik dalam array JavaScript (hapus duplikat)Array asli
arr
dipertahankan (filter
mengembalikan array baru alih-alih memodifikasi yang asli)The
filtered
array berisi semua duplikat; itu bisa juga mengandung lebih dari 1 nilai yang sama (misalnya array kita disaring di sini adalah[ 2, 2, 0, 0, -1, 'a', 'a' ]
)Jika Anda ingin mendapatkan hanya nilai yang digandakan (Anda tidak ingin memiliki banyak duplikat dengan nilai yang sama) Anda dapat menggunakan
[...new Set(filtered)]
(ES6 memiliki objek Set yang hanya dapat menyimpan nilai-nilai unik)Semoga ini membantu.
sumber
Vanilla JS terpendek :
sumber
Ini cara yang sangat ringan dan mudah:
sumber
Dengan ES6 (atau menggunakan Babel atau Typescipt) Anda cukup melakukan:
https://es6console.com/j58euhbt/
sumber
Kode sederhana dengan sintaks ES6 (mengembalikan array duplikat yang diurutkan):
Cara Penggunaan:
sumber
satu liner
sumber
indx!
dilakukan untuk contoh pertama?indx !== ...
- ketimpangan yang ketat.result.filter((ele,indx) => indx !== result.map(e => e.name).indexOf(ele.name));
Jawaban ini mungkin juga membantu, memanfaatkan
reduce
operator / metode js untuk menghapus duplikat dari array.sumber
new Set([1, 2, 2, 3, 3, 3, 3])
untuk menghapus duplikatFungsi berikut (variasi dari fungsi elimDuplicates yang telah disebutkan) tampaknya melakukan trik, mengembalikan test2,1,7,5 untuk input ["test", "test2", "test2", 1, 1, 1, 2 , 3, 4, 5, 6, 7, 7, 10, 22, 43, 1, 5, 8]
Perhatikan bahwa masalahnya lebih aneh di JavaScript daripada di sebagian besar bahasa lain, karena array JavaScript dapat menampung apa saja. Perhatikan bahwa solusi yang menggunakan penyortiran mungkin perlu menyediakan fungsi penyortiran yang sesuai - Saya belum mencoba rute itu.
Implementasi khusus ini berfungsi untuk (setidaknya) string dan angka.
sumber
Hanya ES5 (yaitu, ia membutuhkan filter () polyfill untuk IE8 dan di bawah):
sumber
Fungsi ini menghindari langkah penyortiran dan menggunakan metode pengurangan () untuk mendorong duplikat ke array baru jika belum ada di dalamnya.
sumber
Ini mungkin salah satu cara tercepat untuk menghapus duplikat secara permanen dari array 10x kali lebih cepat daripada kebanyakan fungsi di sini. & 78x lebih cepat di safari
jika Anda tidak dapat membaca kode di atas tanyakan, baca buku javascript atau di sini ada beberapa penjelasan tentang kode pendek. https://stackoverflow.com/a/21353032/2450730
EDIT Seperti yang dinyatakan dalam komentar fungsi ini mengembalikan array dengan keunikan, namun pertanyaannya meminta untuk menemukan duplikat. dalam hal ini modifikasi sederhana untuk fungsi ini memungkinkan untuk mendorong duplikat ke dalam array, kemudian menggunakan fungsi sebelumnya
toUnique
menghapus duplikat dari duplikat.sumber
Menggunakan "termasuk" untuk menguji apakah elemen sudah ada.
sumber
ES6 menawarkan struktur data Set yang pada dasarnya adalah array yang tidak menerima duplikat. Dengan struktur Set data, ada cara yang sangat mudah untuk menemukan duplikat dalam array (hanya menggunakan satu loop).
Ini kode saya
sumber
Saya baru saja menemukan cara sederhana untuk mencapai ini menggunakan filter Array
sumber
Logika berikut akan lebih mudah dan lebih cepat
Keuntungan :
Deskripsi Logika:
Catatan: metode map () dan filter () lebih efisien dan lebih cepat.
sumber