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','!']
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','!']
Jawaban:
Catatan: Ini bukan unicode compliant.
"I๐U".split('')
menghasilkan array 4 karakter["I", "๏ฟฝ", "๏ฟฝ", "u"]
yang dapat menyebabkan bug berbahaya. Lihat jawaban di bawah untuk alternatif yang aman.
Hanya membaginya dengan string kosong.
var output = "Hello world!".split('');
console.log(output);
"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:
// DO NOT USE THIS!
> '๐๐๐๐'.split('')
[ '๏ฟฝ', '๏ฟฝ', '๏ฟฝ', '๏ฟฝ', '๏ฟฝ', '๏ฟฝ', '๏ฟฝ', '๏ฟฝ' ]
Saya sarankan menggunakan salah satu fitur ES2015 berikut untuk menangani urutan karakter ini dengan benar.
> [...'๐๐๐๐']
[ '๐', '๐', '๐', '๐' ]
> Array.from('๐๐๐๐')
[ '๐', '๐', '๐', '๐' ]
u
Bendera RegExp> '๐๐๐๐'.split(/(?=[\s\S])/u)
[ '๐', '๐', '๐', '๐' ]
Gunakan /(?=[\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 ):
> '๐๐๐๐'.split(/(?=(?:[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/);
[ '๐', '๐', '๐', '๐' ]
Perhatikan, bahwa Babel mencoba untuk menangani pengganti yang tidak cocok dengan benar. Namun, ini tampaknya tidak berhasil untuk pengganti rendah yang tak tertandingi.
๐ณ๏ธโ๐
, 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
Sintaks
Anda dapat menggunakan sintaks spread , sebuah Initializer Array yang diperkenalkan dalam standar ECMAScript 2015 (ES6) :
var arr = [...str];
Contohnya
function a() {
return arguments;
}
var str = 'Hello World';
var arr1 = [...str],
arr2 = [...'Hello World'],
arr3 = new Array(...str),
arr4 = a(...str);
console.log(arr1, arr2, arr3, arr4);
Tiga hasil pertama dalam:
["H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d"]
Yang terakhir menghasilkan
{0: "H", 1: "e", 2: "l", 3: "l", 4: "o", 5: " ", 6: "W", 7: "o", 8: "r", 9: "l", 10: "d"}
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
Anda juga bisa menggunakan Array.from
.
var m = "Hello world!";
console.log(Array.from(m))
Metode ini telah diperkenalkan di ES6.
Ini adalah pertanyaan lama tapi saya menemukan solusi lain yang belum terdaftar.
Anda dapat menggunakan fungsi Object.assign untuk mendapatkan hasil yang diinginkan:
var output = Object.assign([], "Hello, world!");
console.log(output);
// [ 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!' ]
Belum tentu benar atau salah, hanyalah pilihan lain.
Array.from("Hello, world")
.
[..."Hello, world"]
Sudah:
var mystring = 'foobar';
console.log(mystring[0]); // Outputs 'f'
console.log(mystring[3]); // Outputs 'b'
Atau untuk versi yang lebih ramah browser, gunakan:
var mystring = 'foobar';
console.log(mystring.charAt(3)); // Outputs 'b'
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.
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 melakukan someString[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 ...
const yourString = 'Hello, World!';
const charArray = [];
for (let i=0; i<=yourString.length; i++) {
charArray.push(yourString[i]);
}
console.log(charArray);
Ada juga berbagai cara singkat untuk mencapai hal yang sama, seperti menggunakan .split()
dengan string kosong sebagai pemisah:
const charArray = 'Hello, World!'.split('');
console.log(charArray);
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:
const yourString = '๐๐๐๐';
console.log('First code unit:', yourString[0]);
const charArray = yourString.split('');
console.log('charArray:', charArray);
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:
const yourString = '๐๐๐๐';
const charArray = [];
for (const char of yourString) {
charArray.push(char);
}
console.log(charArray);
Kita dapat mempersingkat penggunaan ini Array.from
, yang beralih dari iterable yang diteruskan secara implisit:
const yourString = '๐๐๐๐';
const charArray = Array.from(yourString);
console.log(charArray);
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.)
const yourString = 'Aฬ๐ฌ๐ง๐ฉ๐ฟ';
const charArray = Array.from(yourString);
console.log(charArray);
Jika kita ingin menyimpan masing-masing sebagai satu item dalam array terakhir kita, maka kita perlu array grapheme , bukan titik kode.
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
, dan countGraphemes
. Secara alami, kami ingin splitGraphemes
:
const splitter = new GraphemeSplitter();
const yourString = 'Aฬ๐ฌ๐ง๐ฉ๐ฟ';
const charArray = splitter.splitGraphemes(yourString);
console.log(charArray);
<script src="https://cdn.jsdelivr.net/npm/grapheme-splitter@1.0.4/index.js"></script>
Dan inilah kita - sebuah array dari tiga grapheme, yang mungkin adalah yang Anda inginkan.
Anda dapat mengulangi panjang tali dan mendorong karakter di setiap posisi :
const str = 'Hello World';
const stringToArray = (text) => {
var chars = [];
for (var i = 0; i < text.length; i++) {
chars.push(text[i]);
}
return chars
}
console.log(stringToArray(str))
"๐".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:
let str = 'this is string, length is >26';
console.log([...str]);
Satu kemungkinan adalah yang berikutnya:
console.log([1, 2, 3].map(e => Math.random().toString(36).slice(2)).join('').split('').map(e => Math.random() > 0.5 ? e.toUpperCase() : e).join(''));
Bagaimana dengan ini?
function stringToArray(string) {
let length = string.length;
let array = new Array(length);
while (length--) {
array[length] = string[length];
}
return array;
}
Array.prototype.slice akan melakukan pekerjaan dengan baik.
const result = Array.prototype.slice.call("Hello world!");
console.log(result);
"๐จญ".split('')
hasil dalam["๏ฟฝ", "๏ฟฝ"]
.