Memasukkan string pada posisi x dari string lain

237

Saya memiliki dua variabel dan perlu memasukkan string bke string apada titik yang diwakili oleh position. Hasil yang saya cari adalah "Saya ingin apel". Bagaimana saya bisa melakukan ini dengan JavaScript?

var a = 'I want apple';
var b = ' an';
var position = 6;
sami
sumber

Jawaban:

376

var a = "I want apple";
var b = " an";
var position = 6;
var output = [a.slice(0, position), b, a.slice(position)].join('');
console.log(output);


Opsional: Sebagai metode prototipe dari String

Berikut ini dapat digunakan untuk menyambung textdalam string lain pada yang diinginkan index, dengan removeCountparameter opsional .

if (String.prototype.splice === undefined) {
  /**
   * Splices text within a string.
   * @param {int} offset The position to insert the text at (before)
   * @param {string} text The text to insert
   * @param {int} [removeCount=0] An optional number of characters to overwrite
   * @returns {string} A modified string containing the spliced text.
   */
  String.prototype.splice = function(offset, text, removeCount=0) {
    let calculatedOffset = offset < 0 ? this.length + offset : offset;
    return this.substring(0, calculatedOffset) +
      text + this.substring(calculatedOffset + removeCount);
  };
}

let originalText = "I want apple";

// Positive offset
console.log(originalText.splice(6, " an"));
// Negative index
console.log(originalText.splice(-5, "an "));
// Chaining
console.log(originalText.splice(6, " an").splice(2, "need", 4).splice(0, "You", 1));
.as-console-wrapper { top: 0; max-height: 100% !important; }

jandy
sumber
3
Untuk string panjang, solusi ini lebih cepat (karena lebih sedikit salinan) daripada solusi nickf.
Poin
35
Solusi ini tidak lebih cepat. Saya ingin tahu tentang ini dan menjalankan jsperf. Ini adalah catatan bagi siapa saja yang membaca ini di masa depan. jsperf.com/javascript-string-splice . Diuji dalam FF / Chrome / IE10 / IE9 terbaru. Saya akan menggunakan pendekatan lean nickf yang satu ini untuk kejelasan dan kinerja.
junkyspace
3
Yah, itu sangat mungkin. Jawabannya di sini hampir 3 tahun, sebagian besar browser dan versi saat itu, memang dilakukan jauh lebih cepat dengan Array bergabung (terutama IE).
jAndy
1
Saya meminta maaf kepada Anda untuk menghidupkan kembali pertanyaan lama seperti itu, tetapi untuk apa saya sepantasnya var output = [a.slice(0, position + 1), b, a.slice(position)].join('');memberikan OPs "Saya ingin sebuah apel", bukannya "Saya ingin sebuah apel".
paulvs
13
@PaulVon Tidak pernah salah untuk memperbaiki sesuatu, jadi tidak perlu diampuni. Bagaimanapun, saya agak tidak setuju. Secara fungsional melakukan apa yang dimaksudkan untuk dilakukan, masukkan string pada posisi tertentu dalam string lain. Sebenarnya string yang dimasukkan harus seperti "an", yang akan lebih benar dalam contoh ini.
Juli
262
var output = a.substring(0, position) + b + a.substring(position);

Sunting: diganti .substrdengan .substringkarena .substrsekarang merupakan fungsi lawas (per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr )

nickf
sumber
47
Menurut @ junkyspace jsperf.com/javascript-string-splice , jawaban ini 640x lebih cepat daripada yang jAndy.
Paulo Coghi - Reinstate Monica
5
String.prototype.substrsudah usang sekarang. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Tivie
2
substring dalam hal ini adalah pengganti langsung untuk ditinggalkan substr, sehingga jawabannya menjadi: var output = a.substring(0, position) + b + a.substring(position);.
Seafish
Ini tidak sepenuhnya ditinggalkan, tetapi warisan, jadi ide yang baik untuk menggantikan karena kemungkinan akan menjadi usang, dan direkomendasikan oleh MDN untuk digunakan.substring
froggomad
32

Anda dapat menambahkan fungsi ini ke kelas string

String.prototype.insert_at=function(index, string)
{   
  return this.substr(0, index) + string + this.substr(index);
}

sehingga Anda dapat menggunakannya pada objek string apa pun:

var my_string = "abcd";
my_string.insertAt(1, "XX");
jasin_89
sumber
3
Ini adalah praktik buruk untuk memodifikasi prototipe objek asli: stackoverflow.com/questions/14034180/…
jhujhul
10

Menggunakan string liter ES6 , akan jauh lebih pendek:

const insertAt = (str, sub, pos) => `${str.slice(0, pos)}${sub}${str.slice(pos)}`;
    
console.log(insertAt('I want apple', ' an', 6)) // logs 'I want an apple'

Stefan J
sumber
9

Mungkin lebih baik jika Anda menentukan posisi menggunakan indexOf () seperti ini:

function insertString(a, b, at)
{
    var position = a.indexOf(at); 

    if (position !== -1)
    {
        return a.substr(0, position) + b + a.substr(position);    
    }  

    return "substring not found";
}

lalu panggil fungsi seperti ini:

insertString("I want apple", "an ", "apple");

Perhatikan, bahwa saya meletakkan spasi setelah "an" dalam panggilan fungsi, bukan dalam pernyataan pengembalian.

paulo62
sumber
2
Ini bukan yang diminta. Sekalipun ini adalah masalahnya, ini tidak akan berhasil jika Anda memiliki banyak kemunculan substring "at"
elachell
6

The Underscore.String perpustakaan memiliki fungsi yang melakukan Insert

masukkan (string, index, substring) => string

seperti itu

insert("Hello ", 6, "world");
// => "Hello world"
svarog
sumber
Bukan oleh saya, tapi mungkin karena tidak disebutkan perpustakaan itu dalam pertanyaan. Tapi dia juga tampaknya tidak mengecualikan IMO perpustakaan lain ..
Dennis98
1
Meskipun saya tidak suka menggunakan perpustakaan kecuali perlu, saya memilih untuk mengimbangi downvote: P
froggomad
3

mencoba

a.slice(0,position) + b + a.slice(position)

atau solusi regexp

"I want apple".replace(/^(.{6})/,"$1 an")

Kamil Kiełczewski
sumber
2
var array = a.split(' '); 
array.splice(position, 0, b);
var output = array.join(' ');

Ini akan lebih lambat, tetapi akan mengurus penambahan ruang sebelum dan sesudah suatu Juga, Anda harus mengubah nilai posisi (menjadi 2, lebih intuitif sekarang)

Ravindra Sane
sumber
2

Perbaikan cepat! Jika Anda tidak ingin menambahkan spasi secara manual, Anda dapat melakukan ini:

var a = "I want apple";
var b = "an";
var position = 6;
var output = [a.slice(0, position + 1), b, a.slice(position)].join('');
console.log(output);

(sunting: saya melihat ini benar-benar dijawab di atas, maaf!)

K. Yu
sumber
2

Jika ES2018's lookbehind tersedia , satu lagi solusi regexp, yang menggunakannya untuk "mengganti" pada posisi nol lebar setelah karakter Nth (mirip dengan @Kamil Kiełczewski's, tetapi tanpa menyimpan karakter awal dalam grup penangkapan):

"I want apple".replace(/(?<=^.{6})/, " an")

dlauzon
sumber
1

Yah hanya perubahan kecil karena output solusi di atas

"Aku mau apel"

dari pada

"Aku mau apel"

Untuk mendapatkan output sebagai

"Aku mau apel"

gunakan kode modifikasi berikut

var output = a.substr(0, position) + " " + b + a.substr(position);
Clyde Lobo
sumber
13
ya, itu mungkin tidak diinginkan dalam kasus ini , tetapi menambahkan ruang ekstra secara otomatis hampir pasti tidak diinginkan dalam semua kasus.
nickf
12
Bukankah solusi yang benar adalah dengan menambahkan spasi di string = 'an', dengan cara ini Anda dapat menggunakan kembali fungsi
Tosh