Javascript splice
hanya bekerja dengan array. Apakah ada metode serupa untuk string? Atau haruskah saya membuat fungsi kustom saya sendiri?
Metode substr()
, dan substring()
hanya akan mengembalikan string yang diekstrak dan tidak mengubah string aslinya. Yang ingin saya lakukan adalah menghapus beberapa bagian dari string saya dan menerapkan perubahan ke string asli. Selain itu, metode replace()
ini tidak akan berfungsi dalam kasus saya karena saya ingin menghapus bagian yang dimulai dari indeks dan berakhir di indeks lain, persis seperti yang dapat saya lakukan dengan splice()
metode tersebut. Saya mencoba mengubah string saya menjadi array, tetapi ini bukan metode yang rapi.
javascript
ProllyGeek
sumber
sumber
str.split
mungkin fungsi yang Anda cari: google.com/#q=javascript+string+splitstr = str.slice()
?return string.slice(0, startToSplice) + string.slice(endToSplice);
, tidak?Jawaban:
Lebih cepat untuk memotong string dua kali, seperti ini:
function spliceSlice(str, index, count, add) { // We cannot pass negative indexes directly to the 2nd slicing operation. if (index < 0) { index = str.length + index; if (index < 0) { index = 0; } } return str.slice(0, index) + (add || "") + str.slice(index + count); }
daripada menggunakan split diikuti dengan join (metode Kumar Harsh), seperti ini:
function spliceSplit(str, index, count, add) { var ar = str.split(''); ar.splice(index, count, add); return ar.join(''); }
Berikut adalah jsperf yang membandingkan dua dan beberapa metode lainnya. (jsperf telah turun selama beberapa bulan sekarang. Harap sarankan alternatif di komentar.)
Meskipun kode di atas mengimplementasikan fungsi yang mereproduksi fungsionalitas umum
splice
, mengoptimalkan kode untuk kasus yang disajikan oleh penanya (yaitu, tidak menambahkan apa pun ke string yang dimodifikasi) tidak mengubah kinerja relatif dari berbagai metode.sumber
String.prototype.splice = function (index, count, add) { return this.slice(0, index) + (add || "") + this.slice(index + count); }
Ingatlah bahwa ini tidak berfungsi persis sama dengan metode sambungan array karena string tidak dapat diubah (Anda tidak dapat memodifikasinya setelah dibuat). Jadi penggunaannya akan seperti:var s="ss"; s = s.splice(0,1,"t");
var StringUtils={'StringSplice':/*func def*/};
akan menjadi standar untuk manipulasi string seperti yang Anda katakan bahwa itu tidak dapat diubah.Sunting
Ini tentu saja bukan cara terbaik untuk "menyambung" string, saya telah memberikan ini sebagai contoh bagaimana implementasinya akan, yang cacat dan sangat jelas dari split (), splice () dan join (). Untuk implementasi yang jauh lebih baik, lihat metode Louis .
Tidak, tidak ada yang namanya a
String.splice
, tetapi Anda dapat mencoba ini:newStr = str.split(''); // or newStr = [...str]; newStr.splice(2,5); newStr = newStr.join('');
Saya menyadari tidak ada
splice
fungsi seperti di Array, jadi Anda harus mengubah string menjadi array. Nasib sial...sumber
"asdsd".indexOf('s');
[...str]
Inilah kari kecil yang enak yang memberikan keterbacaan yang lebih baik (IMHO):
Tanda tangan fungsi kedua identik dengan
Array.prototype.splice
metode.function mutate(s) { return function splice() { var a = s.split(''); Array.prototype.splice.apply(a, arguments); return a.join(''); }; } mutate('101')(1, 1, '1');
Saya tahu sudah ada jawaban yang diterima, tapi semoga bermanfaat.
sumber
'method'
parameter opsional sehingga Anda bisa meneruskanArray.prototype[method]
dan memperlakukan string sepenuhnya seperti array. Juga, dengan satu ini saja, Anda bisa abstrak proses yang sebenarnya untuk fungsi lain - dan jika tidak ada tali, mengembalikan fungsi yang akan membawa tali dan membalikkan kari:mutate()(1, 1, '1')('101')
; Anda bahkan bisa duckType argumen untuk menyingkirkan kari dari permintaan kosong - bahkan merangkum metode itu sendiri. Jika Anda membutuhkan barang ini, Anda mungkin ingin melihat ke Pola Perintah . Ludah saja di sini.Saya ingin menawarkan alternatif yang lebih sederhana untuk metode Kumar / Cody dan Louis. Pada semua tes yang saya jalankan, itu bekerja secepat metode Louis (lihat tes biola untuk benchmark).
String.prototype.splice = function(startIndex,length,insertString){ return this.substring(0,startIndex) + insertString + this.substring(startIndex + length); };
Anda bisa menggunakannya seperti ini:
var creditCardNumber = "5500000000000004"; var cardSuffix = creditCardNumber.splice(0,12,'****'); console.log(cardSuffix); // output: ****0004
Lihat Hasil Tes: https://jsfiddle.net/0quz9q9m/5/
sumber
, otherwise the third argument is not optional. This implementation also doesn't take care of
startIndex <0` tidak seperti saran lainnya. Contoh penggunaan yang bagus, meskipunTampaknya ada banyak kebingungan yang hanya diatasi di komentar oleh elclanrs dan raina77ow, jadi izinkan saya memposting jawaban klarifikasi.
Klarifikasi
Dari "
string.splice
" orang mungkin mengharapkannya, seperti yang untuk array:Masalahnya, persyaratan 3d tidak dapat dipenuhi karena string tidak dapat diubah (terkait: 1 , 2 ), saya telah menemukan komentar paling berdedikasi di sini :
Jadi, dengan pertimbangan itu, orang mungkin mengharapkan "
string.splice
" untuk hanya:yaitu apa yang
substr
dilakukannya; atau, sebagai alternatif,yang merupakan subjek dari bagian selanjutnya.
Solusi
Jika Anda peduli tentang pengoptimalan, Anda mungkin harus menggunakan implementasi Mike:
String.prototype.splice = function(index, count, add) { if (index < 0) { index += this.length; if (index < 0) index = 0; } return this.slice(0, index) + (add || "") + this.slice(index + count); }
Memperlakukan indeks di luar batas mungkin berbeda-beda. Bergantung pada kebutuhan Anda, Anda mungkin menginginkan:
if (index < 0) { index += this.length; if (index < 0) index = 0; } if (index >= this.length) { index -= this.length; if (index >= this.length) index = this.length - 1; }
atau bahkan
index = index % this.length; if (index < 0) index = this.length + index;
Jika Anda tidak peduli dengan kinerja, Anda mungkin ingin menyesuaikan saran Kumar yang lebih langsung:
String.prototype.splice = function(index, count, add) { var chars = this.split(''); chars.splice(index, count, add); return chars.join(''); }
Performa
Perbedaan penampilan meningkat drastis dengan panjang senar. jsperf menunjukkan , bahwa untuk string dengan panjang 10 solusi terakhir (pemisahan & penggabungan) dua kali lebih lambat dari solusi sebelumnya (menggunakan slice), untuk string 100 huruf x5 dan untuk string 1000 huruf x50, di Ops / detik itu:
10 letters 100 letters 1000 letters slice implementation 1.25 M 2.00 M 1.91 M split implementation 0.63 M 0.22 M 0.04 M
perhatikan bahwa saya telah mengubah argumen 1 dan 2 saat berpindah dari 10 huruf menjadi 100 huruf (tetap saja saya terkejut bahwa tes untuk 100 huruf berjalan lebih cepat dari itu untuk 10 huruf).
sumber
Cukup gunakan substr untuk string
ex.
var str = "Hello world!"; var res = str.substr(1, str.length);
Hasil = ello dunia!
sumber
Jadi, apa pun menambahkan metode sambatan ke prototipe String tidak dapat berfungsi transparan untuk spesifikasi ...
Mari kita lakukan seseorang memperpanjangnya:
String.prototype.splice = function(...a){ for(var r = '', p = 0, i = 1; i < a.length; i+=3) r+= this.slice(p, p=a[i-1]) + (a[i+1]||'') + this.slice(p+a[i], p=a[i+2]||this.length); return r; }
sumber
Metode jawaban Louis , sebagai
String
fungsi prototipe:String.prototype.splice = function(index, count, add) { if (index < 0) { index = this.length + index; if (index < 0) { index = 0; } } return this.slice(0, index) + (add || "") + this.slice(index + count); }
Contoh:
> "Held!".splice(3,0,"lo Worl") < "Hello World!"
sumber
Metode spliceSlice Louis gagal ketika nilai tambah adalah 0 atau nilai salah lainnya, berikut perbaikannya:
function spliceSlice(str, index, count, add) { if (index < 0) { index = str.length + index; if (index < 0) { index = 0; } } const hasAdd = typeof add !== 'undefined'; return str.slice(0, index) + (hasAdd ? add : '') + str.slice(index + count); }
sumber
Saya memecahkan masalah saya menggunakan kode ini, merupakan pengganti sambungan yang hilang.
let str = "I need to remove a character from this"; let pos = str.indexOf("character") if(pos>-1){ let result = str.slice(0, pos-2) + str.slice(pos, str.length); console.log(result) //I need to remove character from this }
Saya perlu menghapus karakter sebelum / setelah kata tertentu, setelah Anda mendapatkan posisi string dibagi menjadi dua dan kemudian disusun ulang dengan menghapus karakter secara fleksibel menggunakan offset bersama
pos
sumber