Başka bir dizenin x konumuna dizgi ekleme


237

İki değişken var ve tarafından temsil edilen noktada bdizeye dize eklemek gerekir . Aradığım sonuç "Elma istiyorum". Bunu JavaScript ile nasıl yapabilirim?aposition

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

Yanıtlar:


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);


İsteğe bağlı: String'in prototip yöntemi olarak

Aşağıdakiler, isteğe bağlı bir parametreyle textistenen bir başka dizede birleştirmek için kullanılabilir .indexremoveCount

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; }


3
Uzun dizeler için bu çözüm, nickf'in çözümünden daha hızlıdır (çünkü daha az kopyalar).
pts

35
Bu çözüm daha hızlı değil. Bunu merak ettim ve bir jsperf koştum. Bu, gelecekte bunu okuyan herkes için bir nottur. jsperf.com/javascript-string-splice . En son FF / Chrome / IE10 / IE9'da test edilmiştir. Yalın nickf'in bu konudaki yaklaşımını hem netlik hem de performans için kullanırdım.
hurdalık

3
Bu çok mümkün. Buradaki cevap neredeyse 3 yaşında, tarayıcıların ve sürümlerin çoğunluğu, gerçekten bir Array katılımıyla (özellikle IE) çok daha hızlı gerçekleştirildi .
jAndy

1
Aferin böyle eski bir soruyu yeniden canlandırması için yalvarıyorum, ama var output = [a.slice(0, position + 1), b, a.slice(position)].join('');değdiğim şey için OP'lere "Elma istiyorum" yerine "Elma istiyorum" vermek olmalı .
paulvs

13
@PaulVon Bir şeyi düzeltmek asla yanlış değildir, bu yüzden affetmeye gerek yoktur. Her neyse, buna katılmıyorum. İşlevsel olarak yapmak istediklerini yapar, başka bir dize içinde belirli bir konuma bir dize ekleyin. Aslında eklenen dize "an" gibi olmalıdır, bu durumda bu daha doğru olur.
jAndy

262
var output = a.substring(0, position) + b + a.substring(position);

Düzenleme: değiştirilmiştir .substrile .substringNEDENİYLE .substrartık eski fonksiyonudur (başına https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr )


47
@Junkyspace jsperf.com/javascript-string-splice'a göre , bu cevap jAndy'nin yanıtından 640 kat daha hızlıdır .
Paulo Coghi - Monica'yı eski durumuna getir

5
String.prototype.substrşu anda kullanımdan kaldırıldı. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
Tivie

2
substring Bu durumda kaldırılmış için doğrudan yerine geçer substr, bu nedenle cevap olur: var output = a.substring(0, position) + b + a.substring(position);.
Deniz Balığı

Kesinlikle .substring
itiraz edilmiyor

32

Bu işlevi string sınıfına ekleyebilirsiniz

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

böylece herhangi bir dize nesnesinde kullanabilirsiniz:

var my_string = "abcd";
my_string.insertAt(1, "XX");

3
Yerel nesne prototipini değiştirmek kötü bir uygulamadır: stackoverflow.com/questions/14034180/…
jhujhul 15:18

10

ES6 dize değişmezlerini kullanmak çok daha kısa olacaktır:

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'


9

Belki bu şekilde indexOf () kullanarak konum belirlerseniz daha da iyidir :

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";
}

sonra işlevi şöyle çağırın:

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

Dönüş deyiminde değil, işlev çağrısında "an" dan sonra bir boşluk bıraktığımı unutmayın.


2
Sorduğu şey bu değil. Durum böyle olsa bile, "at" alt dizesi birden çok kez varsa bu işe yaramaz
elachell

6

Underscore.String kütüphanesi yapan bir işlevi vardır Ekle

insert (dize, dizin, alt dize) => dize

böyle

insert("Hello ", 6, "world");
// => "Hello world"

Benim tarafımdan değil, muhtemelen soruda bu kütüphaneden bahsedilmediğinden. Ama aynı zamanda diğer kütüphaneleri IMO hariç tutmuyor gibi görünüyor ..
Dennis98

1
Gerekmedikçe kütüphaneleri kullanmaktan hoşlanmama rağmen, aşağı oyu dengelemek için oy verdim: P
froggomad

3

Deneyin

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

veya regexp çözümü

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


2
var array = a.split(' '); 
array.splice(position, 0, b);
var output = array.join(' ');

Bu daha yavaş olur, ancak andan önce ve sonra alan eklemeyle ilgilenir. Ayrıca, konum değerini değiştirmeniz gerekir (2'ye, şimdi daha sezgisel)


2

Hızlı düzeltme! Manuel olarak boşluk eklemek istemiyorsanız bunu yapabilirsiniz:

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);

(edit: bunun aslında yukarıda cevaplandığını görüyorum, üzgünüm!)


2

ES2018'in bakış açısı mevcutsa , Nth karakterinden sonra sıfır genişlikli bir konumda "değiştirmek" için kullanılan bir daha regexp çözümü (@Kamil Kiełczewski'ninkine benzer, ancak ilk karakterleri bir yakalama grubunda saklamaksızın):

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


1

Sadece küçük bir değişiklik 'yukarıdaki çözüm çıktılarına neden olur

"Bir elma istiyorum"

onun yerine

"Bir elma istiyorum"

Çıkışı şu şekilde almak için:

"Bir elma istiyorum"

aşağıdaki değiştirilmiş kodu kullan

var output = a.substr(0, position) + " " + b + a.substr(position);

13
evet, muhtemelen bu durumda arzu edilmez , ancak otomatik olarak fazladan bir alan eklemek neredeyse her durumda kesinlikle arzu edilmez .
nickf

12
Doğru çözümler string = 'an' içine boşluk eklemek olmaz, bu şekilde fonksiyonu tekrar kullanabilirsiniz
Tosh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.