Jadi, pertanyaan saya telah ditanyakan oleh orang lain dalam bentuk Java di sini: Java - Buat instance String baru dengan panjang yang ditentukan dan diisi dengan karakter tertentu. Solusi terbaik?
. . . tapi saya sedang mencari yang setara JavaScript.
Pada dasarnya, saya ingin mengisi bidang teks secara dinamis dengan karakter "#", berdasarkan pada atribut "maxlength" dari masing-masing bidang. Jadi, jika suatu input memiliki maxlength="3"
, maka isian akan diisi dengan "###".
Idealnya akan ada sesuatu seperti Java StringUtils.repeat("#", 10);
, tetapi, sejauh ini, opsi terbaik yang dapat saya pikirkan adalah untuk mengulang dan menambahkan karakter "#", satu per satu, hingga panjang maksimal tercapai. Saya tidak bisa menghilangkan perasaan bahwa ada cara yang lebih efisien untuk melakukannya daripada itu.
Ada ide?
FYI - Saya tidak bisa begitu saja menetapkan nilai default di input, karena karakter "#" perlu jelas pada fokus, dan, jika pengguna tidak memasukkan nilai, harus "diisi" pada blur. Ini langkah "isi ulang" yang saya khawatirkan
sumber
Jawaban:
Cara terbaik untuk melakukan ini (yang pernah saya lihat) adalah
Itu menciptakan array dengan panjang yang diberikan, dan kemudian bergabung dengan string yang diberikan untuk diulang. The
.join()
Fungsi menghormati panjang array terlepas dari apakah elemen memiliki nilai yang ditetapkan, dan nilai-nilai terdefinisi tersebut diberikan sebagai string kosong.Anda harus menambahkan 1 ke panjang yang diinginkan karena string pemisah berada di antara elemen array.
sumber
parseInt()
nilai input maxlength sebelum menggunakannya untuk ukuran array. Apa yang saya cari. . . Terima kasih!repeat
fungsi baru yang dibangun ke dalam String.prototype menangani ini sekarang (ES6 +)Coba ini: P
sumber
_.repeat('*',10);
repeat()
metode ini. Menantikan hari ketika saya tidak perlu peduli lagi dengan mereka, saya sendiri. . .Sayangnya meskipun pendekatan Array.join yang disebutkan di sini singkat, ini sekitar 10X lebih lambat daripada implementasi berbasis string-concatenation. Ini melakukan sangat buruk pada string besar. Lihat di bawah untuk detail kinerja lengkap.
Di Firefox, Chrome, Node.js MacOS, Node.js Ubuntu, dan Safari, implementasi tercepat yang saya uji adalah:
Ini verbose, jadi jika Anda menginginkan implementasi singkat Anda bisa menggunakan pendekatan naif; itu masih melakukan antara 2X hingga 10X lebih baik daripada pendekatan Array.join, dan juga lebih cepat daripada implementasi penggandaan untuk input kecil. Kode:
Informasi lebih lanjut:
sumber
Saya akan membuat string konstan dan kemudian memanggil substring di atasnya.
Sesuatu seperti
Sedikit lebih cepat juga.
http://jsperf.com/const-vs-join
sumber
ES2015 cara termudah adalah melakukan sesuatu seperti
'X'.repeat(data.length)
X
menjadi string apa pun,data.length
menjadi panjang yang diinginkan.lihat: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat
sumber
Opsi ES6 yang bagus
padStart
adalah string kosong. Seperti ini:Catatan: ini tidak akan berfungsi di IE (tanpa polyfill).
sumber
s = '#'.repeat(10)
) dari jawaban @ user4227915 di atas?Versi yang berfungsi di semua browser
Fungsi ini melakukan apa yang Anda inginkan, dan melakukan jauh lebih cepat daripada opsi yang disarankan dalam jawaban yang diterima:
Anda menggunakannya seperti ini:
Untuk membandingkan kinerja fungsi ini dengan opsi yang diusulkan dalam jawaban yang diterima, lihat Fiddle dan Fiddle ini untuk tolok ukur.
Versi hanya untuk browser modern
Di browser modern, sekarang Anda juga dapat melakukan ini:
Opsi ini bahkan lebih cepat. Namun, sayangnya itu tidak berfungsi di versi Internet Explorer apa pun.
Angka-angka dalam tabel menentukan versi browser pertama yang sepenuhnya mendukung metode ini:
sumber
Anda juga dapat menambahkan polyfill untuk Ulangi untuk browser yang lebih lama
sumber
Berdasarkan jawaban dari Hogan dan Zero Trick Pony. Saya pikir ini harus cepat dan cukup fleksibel untuk menangani sebagian besar kasus penggunaan dengan baik:
sumber
Anda dapat menggunakan baris pertama dari fungsi sebagai satu-baris jika Anda suka:
sumber