Bagaimana Anda mengonversi string ke array karakter dalam JavaScript?
Saya sedang berpikir mendapatkan string suka "Hello world!"
ke array
['H','e','l','l','o',' ','w','o','r','l','d','!']
javascript
arrays
string
DarkLightA
sumber
sumber
"π¨".split('')
hasil dalam["οΏ½", "οΏ½"]
."randomstring".length;
//12
"randomstring"[2];
//"n"
str.length
tidak memberi tahu Anda jumlah karakter dalam string, karena beberapa karakter mengambil lebih banyak ruang daripada yang lain;str.length
memberi tahu Anda nomor angka 16-bit.Seperti yang dikatakan hippietrail , jawaban meder dapat mematahkan pasangan pengganti dan salah mengartikan "karakter". Sebagai contoh:
Saya sarankan menggunakan salah satu fitur ES2015 berikut untuk menangani urutan karakter ini dengan benar.
Sebarkan sintaks ( sudah dijawab oleh insertusernamehere)
Dari Array
u
Bendera RegExpGunakan
/(?=[\s\S])/u
sebagai ganti/(?=.)/u
karena.
tidak cocok dengan baris baru .Jika Anda masih di era ES5.1 (atau jika browser Anda tidak menangani regex ini dengan benar - seperti Edge), Anda dapat menggunakan alternatif ini (ditranslasikan oleh Babel ):
Perhatikan, bahwa Babel mencoba untuk menangani pengganti yang tidak cocok dengan benar. Namun, ini tampaknya tidak berhasil untuk pengganti rendah yang tak tertandingi.
Uji semua di browser Anda:
Tampilkan cuplikan kode
sumber
π³οΈβπ
, dan membagi menggabungkan tanda diakritik dari karakter. Jika Anda ingin membagi ke dalam cluster grapheme alih-alih karakter, lihat stackoverflow.com/a/45238376 .The
spread
SintaksAnda dapat menggunakan sintaks spread , sebuah Initializer Array yang diperkenalkan dalam standar ECMAScript 2015 (ES6) :
Contohnya
Tiga hasil pertama dalam:
Yang terakhir menghasilkan
Dukungan Browser
Periksa tabel kompatibilitas ECMAScript ES6 .
Bacaan lebih lanjut
spread
juga dirujuk sebagai "splat
" (mis. dalam PHP atau Ruby atau sebagai "scatter
" (misalnya dalam Python ).Demo
Coba sebelum membeli
sumber
Anda juga bisa menggunakan
Array.from
.Metode ini telah diperkenalkan di ES6.
Referensi
Dari Array
sumber
Ini adalah pertanyaan lama tapi saya menemukan solusi lain yang belum terdaftar.
Anda dapat menggunakan fungsi Object.assign untuk mendapatkan hasil yang diinginkan:
Belum tentu benar atau salah, hanyalah pilihan lain.
Object.assign dijelaskan dengan baik di situs MDN.
sumber
Array.from("Hello, world")
.[..."Hello, world"]
Sudah:
Atau untuk versi yang lebih ramah browser, gunakan:
sumber
alert("Hello world!" == ['H','e','l','l','o',' ','w','o','r','l','d'])
mystring.charAt(index)
.charAt()
walaupun saya lebih suka menggunakan varian array-ish. Darn IE.Ada (setidaknya) tiga hal berbeda yang mungkin Anda bayangkan sebagai "karakter", dan akibatnya, tiga kategori pendekatan yang berbeda yang mungkin ingin Anda gunakan.
Membagi menjadi unit kode UTF-16
String JavaScript awalnya diciptakan sebagai urutan unit kode UTF-16, kembali pada suatu titik dalam sejarah ketika ada hubungan satu-ke-satu antara unit kode UTF-16 dan titik kode Unicode. The
.length
properti string mengukur panjangnya di unit UTF-16 kode, dan ketika Anda melakukansomeString[i]
Anda mendapatkan i th UTF-16 kode unit darisomeString
.Akibatnya, Anda bisa mendapatkan array unit kode UTF-16 dari string dengan menggunakan C-style for-loop dengan variabel indeks ...
Ada juga berbagai cara singkat untuk mencapai hal yang sama, seperti menggunakan
.split()
dengan string kosong sebagai pemisah:Namun, jika string Anda berisi titik kode yang terdiri dari beberapa unit kode UTF-16, ini akan membaginya menjadi unit kode individual, yang mungkin bukan yang Anda inginkan. Misalnya, string
'ππππ'
terdiri dari empat titik kode unicode (titik kode 0x1D7D8 hingga 0x1D7DB) yang, dalam UTF-16, masing-masing terdiri dari dua unit kode UTF-16. Jika kami membagi string itu menggunakan metode di atas, kami akan mendapatkan array delapan unit kode:Membagi menjadi Poin Kode Unicode
Jadi, mungkin kita ingin membagi string kita menjadi Poin Kode Unicode! Itu dimungkinkan karena ECMAScript 2015 menambahkan konsep iterable ke bahasa. String sekarang iterables, dan ketika Anda mengulanginya (misalnya dengan
for...of
loop), Anda mendapatkan poin kode Unicode, bukan unit kode UTF-16:Kita dapat mempersingkat penggunaan ini
Array.from
, yang beralih dari iterable yang diteruskan secara implisit:Namun, poin kode unicode bukan hal terbesar yang mungkin yang mungkin bisa dianggap sebagai "karakter" baik . Beberapa contoh hal-hal yang dapat dianggap sebagai "karakter" tunggal tetapi terdiri dari beberapa titik kode meliputi:
Kita dapat melihat di bawah ini bahwa jika kita mencoba untuk mengubah string dengan karakter tersebut ke dalam array melalui mekanisme iterasi di atas, karakter tersebut akhirnya dipecah dalam array yang dihasilkan. (Jika salah satu karakter tidak ditampilkan di sistem Anda, di
yourString
bawah ini terdiri dari huruf kapital A dengan aksen akut, diikuti oleh bendera Inggris, diikuti oleh wanita kulit hitam.)Jika kita ingin menyimpan masing-masing sebagai satu item dalam array terakhir kita, maka kita perlu array grapheme , bukan titik kode.
Membagi menjadi grafem
JavaScript tidak memiliki dukungan bawaan untuk ini - setidaknya belum. Jadi kita membutuhkan pustaka yang memahami dan mengimplementasikan aturan Unicode untuk kombinasi poin kode apa yang membentuk suatu grafem. Untungnya, ada: graphling -splitter orling . Anda ingin menginstalnya dengan npm atau, jika Anda tidak menggunakan npm, unduh file index.js dan sajikan dengan
<script>
tag. Untuk demo ini, saya akan memuatnya dari jsDelivr.grafem-splitter memberi kita
GraphemeSplitter
kelas dengan tiga metode:splitGraphemes
,iterateGraphemes
, dancountGraphemes
. Secara alami, kami inginsplitGraphemes
:Dan inilah kita - sebuah array dari tiga grapheme, yang mungkin adalah yang Anda inginkan.
sumber
Anda dapat mengulangi panjang tali dan mendorong karakter di setiap posisi :
sumber
"π".charAt(0)
akan mengembalikan karakter yang tidak dapat digunakan.split("")
opsi tercepat lagi.split("")
tampaknya sangat dioptimalkan dalam firefox. Sementara loop memiliki kinerja yang sama di chrome dan firefox split secara signifikan lebih cepat di firefox untuk input kecil dan besar.jawaban sederhana:
sumber
Satu kemungkinan adalah yang berikutnya:
sumber
Bagaimana dengan ini?
sumber
Array.prototype.slice akan melakukan pekerjaan dengan baik.
sumber