Bagaimana saya bisa mendapatkan daftar nilai unik dalam array? Apakah saya selalu harus menggunakan array kedua atau ada sesuatu yang mirip dengan hashmap java di JavaScript?
Saya akan menggunakan JavaScript dan jQuery saja. Tidak ada perpustakaan tambahan yang dapat digunakan.
javascript
jquery
Astronaut
sumber
sumber
underscore.js
perpustakaan?list.toSet
Jawaban:
Karena saya meneruskannya di komentar untuk jawaban @ Rocket, saya mungkin juga memberikan contoh yang tidak menggunakan perpustakaan. Ini membutuhkan dua fungsi prototipe baru,
contains
danunique
Untuk keandalan yang lebih, Anda dapat mengganti
contains
denganindexOf
shim MDN dan memeriksa apakah setiap elemenindexOf
sama dengan dokumentasi -1 :.sumber
~a.indexOf(b) === (a.indexOf(b) == -1)
if (~a.indexOf(b)) ...
adalah identik untuk menulis lagiif (a.indexOf(b) == -1) ...
.Atau bagi mereka yang mencari satu-liner (sederhana dan fungsional), kompatibel dengan browser saat ini :
Perbarui 18-04-2017
Tampaknya seolah-olah 'Array.prototype.includes' sekarang memiliki dukungan luas di versi terbaru dari browser utama ( kompatibilitas )
Pembaruan 29-07-2015:
Ada rencana dalam karya untuk browser untuk mendukung metode 'Array.prototype.includes' standar, yang meskipun tidak secara langsung menjawab pertanyaan ini; sering terkait.
Pemakaian:
Pollyfill ( dukungan browser , sumber dari mozilla ):
sumber
Inilah solusi yang jauh lebih bersih untuk ES6 yang saya lihat tidak termasuk di sini. Ini menggunakan Set dan operator spread :
...
Yang kembali
[1, 2]
sumber
Array.from(... new Set(a))
karena Set tidak dapat secara implisit dikonversi ke jenis array. Hanya kepala!Array.from(new Set(a))
? Itu sepertinya berhasil.Satu Liner, JavaScript Murni
Dengan sintaks ES6
list = list.filter((x, i, a) => a.indexOf(x) === i)
Dengan sintaks ES5
Kompatibilitas Browser : IE9 +
sumber
a.indexOf(x) === i
nota kesetaraan tiga tanda sama.Menggunakan EcmaScript 2016 Anda bisa melakukannya seperti ini.
Set selalu unik, dan menggunakan
Array.from()
Anda dapat mengonversi Set ke array. Untuk referensi, lihat dokumentasi.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /Set
sumber
indexOf()
jawabannya mengerikan karena mereka O (N ^ 2). Jawaban sebarannya ok tapi tidak akan berfungsi untuk array besar. Ini adalah pendekatan terbaik.Sekarang di ES6 kita dapat menggunakan fungsi ES6 yang baru diperkenalkan
ATAU oleh Array menyebar sintaks pada iterables
Ini akan mengembalikan hasil yang unik.
sumber
new Set
seperti ini (seperti Angular / TypeScript modern)let items = [1,1,1,1,3,4,5,2,23,1,4,4,4,2,2,2];
let uniqueItems = [...new Set(items)];
Jika Anda ingin membiarkan array asli tetap utuh,
Anda memerlukan array kedua untuk memuat elemen unik dari first-
Sebagian besar browser memiliki
Array.prototype.filter
:sumber
Saat ini, Anda dapat menggunakan tipe data Set ES6 untuk mengonversi array Anda ke Set unik. Kemudian, jika Anda perlu menggunakan metode array, Anda dapat mengubahnya kembali menjadi Array:
sumber
var uniqueArr = [...new Set(arr)]; // ["a", "b"]
Bukan asli dalam Javascript, tetapi banyak perpustakaan memiliki metode ini.
_.uniq(array)
( Tautan ) Underscore.js bekerja dengan sangat baik ( sumber ).sumber
Menggunakan jQuery, inilah fungsi unik Array yang saya buat:
sumber
$.uniqueArray(arr)
? Memasukkan referensi ke jQuery dalamArray
prototipe sepertinya dipertanyakan$.uniqueArray
bergantung pada jQuery; kurang jelasArray.prototype.unique
juga.prototype
s. Tapi, saya mengerti maksud Anda sekarang. Saya akan meninggalkan ini di sini.Solusi pendek dan manis menggunakan array kedua;
sumber
Cepat, ringkas, tanpa loop bersarang, bekerja dengan objek apa pun, tidak hanya string dan angka, mengambil predikat, dan hanya 5 baris kode !!
Contoh: Untuk menemukan barang unik berdasarkan jenis:
Jika Anda ingin menemukan item unik pertama, bukan yang terakhir tambahkan found.hasOwnPropery () periksa di sana.
sumber
Anda hanya perlu vanilla JS untuk menemukan unik dengan Array.some dan Array.reduce. Dengan sintaksis ES2015 hanya 62 karakter.
Array.some dan Array.reduce didukung di IE9 + dan browser lainnya. Cukup ubah fungsi panah gemuk untuk mendukung fungsi biasa di browser yang tidak mendukung sintaks ES2015.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects / Array / Kurangi
sumber
Sebagian besar solusi di atas memiliki kompleksitas waktu lari yang tinggi.
Berikut adalah solusi yang menggunakan
reduce
dan dapat melakukan pekerjaan dalam waktu O (n).catatan:
Solusi ini tidak bergantung pada pengurangan. Idenya adalah untuk membuat peta objek dan mendorong yang unik ke dalam array.
sumber
Cara ES6:
sumber
kamu bisa memakai,
itu akan memberi Anda elemen unik,
**> tapi ada tangkapan,
Opsi kedua adalah menggunakan metode filter pada array.
sumber
Anda dapat memasukkan array dengan duplikat dan metode di bawah ini akan mengembalikan array dengan elemen unik.
sumber
Satu-satunya masalah dengan solusi yang diberikan sejauh ini adalah efisiensi. Jika Anda khawatir tentang itu (dan Anda mungkin harus), Anda perlu menghindari loop bersarang: untuk * untuk, filter * indexOf, grep * inArray, semuanya mengulangi array beberapa kali. Anda dapat menerapkan satu loop dengan solusi seperti ini atau ini
sumber
sumber
Saya telah mencoba masalah ini di JS murni. Saya telah mengikuti langkah-langkah berikut: 1. Urutkan array yang diberikan, 2. loop melalui array yang diurutkan, 3. Verifikasi nilai sebelumnya dan nilai berikutnya dengan nilai saat ini
Demo
sumber
sumber
Mengingat yang
indexOf
akan mengembalikan kemunculan pertama elemen, Anda dapat melakukan sesuatu seperti ini:sumber
Jika Anda tidak perlu terlalu khawatir tentang browser lama, inilah yang dirancang untuk Sets.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
sumber
Pemikiran lain dari pertanyaan ini. Inilah yang saya lakukan untuk mencapai ini dengan kode lebih sedikit.
sumber
sumber
Berikut ini adalah pendekatan dengan
equals
fungsi yang dapat dikustomisasi yang dapat digunakan untuk primitif maupun untuk objek kustom:pemakaian:
sumber
Jawaban saya menggunakan
Array.filter
danArray.indexOf
metode untuk mendapatkan nilai unikSaya melihat pendekatan ini di sebuah situs web tetapi kode mereka berbeda dari yang terlihat di sini. Saya telah menyederhanakan kode menjadi satu baris dan mempostingnya di sini sehingga seseorang akan mendapat manfaat darinya
Catatan: Pendekatan saya mirip atau sama dengan liner yang diposting oleh Josh. Saya meninggalkannya di sini karena nama variabel cukup jelas dalam kode saya.
sumber
Saya hanya berpikir jika kita dapat menggunakan pencarian linear untuk menghilangkan duplikat:
}
HTML:
sumber
Berikut adalah solusi satu liner untuk masalah ini:
Salin tempel ini ke konsol browser dan dapatkan hasilnya, ya :-)
sumber
saya punya fungsi unik JQuery inbuilt .
Untuk lebih lanjut Anda bisa merujuk ke Dokumentasi API jquery.
http://api.jquery.com/jquery.unique/
sumber