Anda dapat melakukan sesuatu seperti ini:
"1234567890".match(/.{1,2}/g);
// Results in:
["12", "34", "56", "78", "90"]
Metode ini masih akan bekerja dengan string yang ukurannya bukan kelipatan pasti dari ukuran chunk:
"123456789".match(/.{1,2}/g);
// Results in:
["12", "34", "56", "78", "9"]
Secara umum, untuk string apa pun yang ingin Anda ekstrak paling banyak substring n- berukuran, Anda akan melakukan:
str.match(/.{1,n}/g); // Replace n with the size of the substring
Jika string Anda dapat berisi baris baru atau carriage return, Anda akan melakukannya:
str.match(/(.|[\r\n]){1,n}/g); // Replace n with the size of the substring
Sejauh kinerja, saya mencoba ini dengan sekitar 10 ribu karakter dan butuh sedikit lebih dari satu detik di Chrome. YMMV.
Ini juga dapat digunakan dalam fungsi yang dapat digunakan kembali:
function chunkString(str, length) {
return str.match(new RegExp('.{1,' + length + '}', 'g'));
}
.
sekali tidak cocok dengan baris baru. Saya akan memperbarui jawabannya sehingga perlu\n
dan\r
diperhitungkan.var chunks = str.split("").reverse().join().match(/.{1, 4}/).map(function(s) { return s.split("").reverse().join(); });
. Ini melakukannya dalam potongan 4. Saya tidak yakin apa yang Anda maksud dengan "kurang atau lebih". Ingatlah bahwa ini tidak akan berfungsi secara umum, terutama dengan string yang berisi kombinasi karakter dan juga dapat merusak string Unicode.[^]
. Dengan ini contoh Anda akan menghasilkanstr.match(/[^]{1,n}/g)
Saya membuat beberapa varian lebih cepat yang dapat Anda lihat di jsPerf . Yang favorit saya adalah ini:
sumber
Math.ceil()
untuk menentukan jumlah potongan yang benar.match
,slice
,substr
dansubstring
match
danslice
untuk ukuran chunk yang berbedamatch
danslice
dengan ukuran potongan kecilIntinya:
match
sangat tidak efisien,slice
lebih baik, di Firefoxsubstr
/substring
masih lebih baikmatch
bahkan lebih tidak efisien untuk string pendek (bahkan dengan regex di-cache - mungkin karena waktu setup parsing regex)match
bahkan lebih tidak efisien untuk ukuran bongkahan besar (mungkin karena ketidakmampuan untuk "melompat")match
mengunggulislice
IE yang lebih lama tetapi masih kalah pada semua sistem lainnyasumber
Ini adalah solusi yang cepat dan mudah -
sumber
substr()
sebagai gantinyasubstring()
.Mengherankan! Anda dapat menggunakan split untuk membagi.
Hasil dalam
[ '12', '34', '56', '78', '90', ' ' ]
sumber
filter (o=>o)
?filter(x=>x)
digunakan untuk menyaring elemensumber
Saya telah menulis fungsi yang diperluas, jadi panjang chunk juga bisa berupa array angka, seperti [1,3]
Kode
akan kembali:
sumber
itu string besar Split ke string kecil kata-kata yang diberikan .
sumber
sumber
Saya akan menggunakan regex ...
sumber
Sebut saja sesuai kebutuhan
sumber
Inilah solusi yang saya buat untuk string templat setelah sedikit bereksperimen:
Pemakaian:
sumber
Anda dapat menggunakan
reduce()
tanpa regex apa pun:sumber
reduce
metode Anda .Dalam bentuk fungsi prototipe:
sumber
Berikut adalah kode yang saya gunakan, menggunakan String.prototype.slice .
Ya itu cukup lama karena jawabannya mencoba untuk mengikuti standar saat ini sedekat mungkin dan tentu saja mengandung jumlah JSDOC yang masuk akal komentar . Namun, setelah diperkecil, kodenya hanya 828 byte dan sekali di-gzip untuk transmisi hanya 497 byte.
Metode 1 yang ditambahkan ini
String.prototype
(menggunakan Object.defineProperty jika tersedia) adalah:Sejumlah tes telah disertakan untuk memeriksa fungsionalitasnya.
Khawatir panjang kode akan memengaruhi kinerja? Tidak perlu khawatir, http://jsperf.com/chunk-string/3
Sebagian besar kode tambahan ada untuk memastikan bahwa kode akan merespons yang sama di beberapa lingkungan javascript.
sumber
Menggunakan metode slice ():
Hal yang sama dapat dilakukan dengan menggunakan metode substring ().
sumber
Masalah saya dengan solusi di atas adalah bahwa ia memasukkan string ke dalam potongan ukuran formal terlepas dari posisi dalam kalimat.
Saya pikir berikut ini pendekatan yang lebih baik; meskipun perlu beberapa penyesuaian kinerja:
sumber
Anda pasti dapat melakukan sesuatu seperti
untuk mendapatkan ini:
Jika Anda ingin secara dinamis memasukkan / menyesuaikan ukuran chunk sehingga chunks berukuran n, Anda dapat melakukan ini:
Untuk menemukan semua ukuran yang mungkin dan potongan dalam string asli, coba ini:
Anda harus berakhir dengan:
sumber
sumber
Bagaimana dengan sepotong kecil kode ini:
sumber
sumber