การแทรกสตริงที่ตำแหน่ง x ของสตริงอื่น


237

ฉันมีสองตัวแปรและจำเป็นที่จะต้องสตริงแทรกbเป็นสตริงที่จุดที่แสดงโดยa positionผลลัพธ์ที่ฉันต้องการคือ "ฉันต้องการแอปเปิ้ล" ฉันจะทำสิ่งนี้กับ JavaScript ได้อย่างไร

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

คำตอบ:


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


ทางเลือก: เป็นวิธีต้นแบบของ String

ต่อไปนี้สามารถใช้เพื่อประกบกันtextภายในสตริงอื่นที่ต้องการindexพร้อมกับremoveCountพารามิเตอร์เสริม

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
สำหรับสายยาวโซลูชันนี้เร็วกว่า (เพราะคัดลอกน้อยกว่า) โซลูชันของ nickf
pts

35
วิธีนี้ไม่เร็ว ฉันอยากรู้เกี่ยวกับเรื่องนี้และวิ่ง jsperf นี่คือบันทึกสำหรับทุกคนที่อ่านสิ่งนี้ในอนาคต jsperf.com/javascript-string-splice ทดสอบใน FF / Chrome / IE10 / IE9 ล่าสุด ฉันจะใช้วิธีการของ lean nickf เหนือวิธีนี้เพื่อความชัดเจนและประสิทธิภาพ
junkyspace

3
เป็นไปได้มาก คำตอบที่นี่มีอายุเกือบ 3 ปีส่วนใหญ่ของเบราว์เซอร์และรุ่นก่อนหน้านี้ดำเนินการได้เร็วขึ้นด้วยArray join (โดยเฉพาะ IE)
jAndy

1
ฉันขอให้อภัยของคุณเพื่อฟื้นฟูคำถามเก่า ๆ แต่สำหรับสิ่งที่ฉันควรค่าvar output = [a.slice(0, position + 1), b, a.slice(position)].join('');แก่การให้ OPs "ฉันต้องการแอปเปิ้ล" แทนที่จะเป็น "I wantan apple"
paulvs

13
@ PaulVon ไม่เคยผิดที่จะแก้ไขบางสิ่งบางอย่างดังนั้นจึงไม่จำเป็นต้องให้อภัย อย่างไรก็ตามฉันไม่เห็นด้วย ในทางปฏิบัติทำสิ่งที่ตั้งใจจะทำแทรกสตริงที่ตำแหน่งที่แน่นอนภายในสตริงอื่น ที่จริงแล้วสตริงที่แทรกควรเป็น "an" ซึ่งจะถูกต้องมากขึ้นในอินสแตนซ์นี้
jAndy

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

แก้ไข: แทนที่.substrด้วย.substringเพราะ.substrตอนนี้เป็นฟังก์ชันดั้งเดิม (ต่อhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr )


47
ตามที่ @junkyspace jsperf.com/javascript-string-spliceคำตอบนี้คือเร็วกว่า 640 เท่าของ jAndy
Paulo Coghi - Reinstate Monica

5
String.prototype.substrเลิกใช้แล้วในขณะนี้ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

2
substring ในกรณีนี้เป็นการแทนที่โดยตรงสำหรับที่เลิกใช้แล้ว substrดังนั้นคำตอบจึงกลายเป็น: var output = a.substring(0, position) + b + a.substring(position);.
Seafish

มันไม่ได้ถูกคัดค้านอย่างเคร่งครัด แต่เป็นมรดกดังนั้นจึงเป็นความคิดที่ดีที่จะแทนที่มันน่าจะเลิกแล้วและ MDN แนะนำให้ใช้.substring
Froggomad

32

คุณสามารถเพิ่มฟังก์ชั่นนี้ในคลาสสตริง

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

เพื่อให้คุณสามารถใช้กับวัตถุสตริงใด ๆ :

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

3
เป็นวิธีปฏิบัติที่ไม่ถูกต้องในการปรับเปลี่ยนต้นแบบวัตถุเนทิฟ: stackoverflow.com/questions/14034180/…
jhujhul


9

อาจจะดีกว่านี้หากคุณระบุตำแหน่งโดยใช้indexOf ()เช่นนี้:

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

จากนั้นเรียกใช้ฟังก์ชันดังนี้:

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

โปรดทราบว่าฉันใส่ช่องว่างหลังจาก "an" ในการเรียกใช้ฟังก์ชั่นมากกว่าในคำสั่งส่งคืน


2
นี่ไม่ใช่สิ่งที่ถูกถาม แม้ว่านี่จะเป็นกรณีนี้ แต่จะไม่ทำงานถ้าคุณมีสตริงย่อย "ที่" หลายครั้ง
elachell

6

Underscore.Stringห้องสมุดมีฟังก์ชั่นที่ไม่แทรก

insert (string, index, substring) => string

ชอบมาก

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

ไม่ใช่โดยฉัน แต่อาจเป็นเพราะไม่มีการพูดถึงห้องสมุดในคำถาม แต่ดูเหมือนว่าเขาจะไม่รวม
ไลบรารี่

1
แม้ว่าฉันไม่ชอบการใช้ห้องสมุดหากจำเป็นฉันก็ upvoted เพื่อชดเชย downvote: P
froggomad

3

ลอง

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

หรือโซลูชัน regexp

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


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

สิ่งนี้จะช้าลง แต่จะดูแลการเพิ่มพื้นที่ก่อนและหลังการนอกจากนี้คุณจะต้องเปลี่ยนค่าของตำแหน่ง (เป็น 2 ซึ่งตอนนี้ใช้งานได้ง่ายขึ้น)


2

แก้ไขด่วน! หากคุณไม่ต้องการเพิ่มช่องว่างด้วยตนเองคุณสามารถทำได้:

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

(แก้ไข: ฉันเห็นว่านี่เป็นคำตอบจริงข้างต้นขอโทษ!)


2

ถ้า lookbehind ของ ES2018 มีอีกหนึ่งโซลูชัน regexp ที่ใช้เพื่อ "แทนที่" ที่ตำแหน่งศูนย์กว้างหลังจากอักขระ Nth (คล้ายกับ @Kamil Kiełczewski แต่ไม่มีการเก็บอักขระเริ่มต้นในกลุ่มการจับ):

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


1

การเปลี่ยนแปลงเพียงเล็กน้อยก็เป็นสาเหตุให้โซลูชันดังกล่าวส่งออก

"ฉันต้องการ anapple"

แทน

"ฉันต้องการแอปเปิ้ล"

เพื่อรับเอาท์พุทเป็น

"ฉันต้องการแอปเปิ้ล"

ใช้รหัสแก้ไขต่อไปนี้

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

13
ใช่มันอาจไม่เป็นที่ต้องการในกรณีนี้แต่การเพิ่มพื้นที่พิเศษโดยอัตโนมัตินั้นแทบไม่เป็นที่ต้องการในทุกกรณี
nickf

12
จะไม่แก้ปัญหาที่ถูกต้องคือการเพิ่มช่องว่างใน string = 'an' ด้วยวิธีนี้คุณสามารถใช้ฟังก์ชั่นนี้ได้อีกครั้ง
Tosh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.