Chèn chuỗi tại vị trí x của chuỗi khác


237

Tôi có hai biến và cần chèn chuỗi bvào chuỗi atại điểm được đại diện bởi position. Kết quả tôi đang tìm kiếm là "Tôi muốn một quả táo". Làm cách nào để làm điều này với JavaScript?

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

Câu trả lời:


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


Tùy chọn: Là một phương thức nguyên mẫu của String

Sau đây có thể được sử dụng để ghép texttrong một chuỗi khác theo mong muốn index, với một removeCounttham số tùy chọn .

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
Đối với các chuỗi dài, giải pháp này nhanh hơn (vì nó sao chép ít hơn) so với giải pháp của nickf.
pts

35
Giải pháp này không nhanh hơn. Tôi tò mò về điều này và chạy một jsperf. Đây là một lưu ý cho bất cứ ai đọc điều này trong tương lai. jsperf.com/javascript- chuỗi-splice . Đã thử nghiệm trong FF / Chrome / IE10 / IE9 mới nhất. Tôi sẽ sử dụng cách tiếp cận của nickf nạc trên phương pháp này cho cả sự rõ ràng và hiệu suất.
gian rác

3
Vâng, đó là rất có thể. Câu trả lời ở đây đã gần 3 năm, phần lớn các trình duyệt và phiên bản trước đó, thực sự đã hoạt động nhanh hơn với một phép nối Array (đặc biệt là IE).
jAndy

1
Tôi cầu xin sự tha thứ của bạn đã làm sống lại một câu hỏi cũ như vậy, nhưng với giá trị của tôi, tôi nên var output = [a.slice(0, position + 1), b, a.slice(position)].join('');đưa ra cho OP "Tôi muốn một quả táo", thay vì "Tôi muốn táo".
paulvs

13
@PaulVon Không bao giờ sai khi sửa một cái gì đó, vì vậy không cần phải ân xá. Dù sao, tôi không đồng ý. Chức năng thực hiện những gì nó dự định làm, chèn một chuỗi tại một vị trí nhất định trong một chuỗi khác. Trên thực tế, chuỗi được chèn phải giống như "an", điều này sẽ đúng hơn trong trường hợp này.
jAndy

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

Chỉnh sửa: được thay thế .substrbằng .substring.substrgiờ đây là một chức năng cũ (theo https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr )


47
Theo @junkyspace jsperf.com/javascript-opes-splice , câu trả lời này nhanh hơn 640 lần so với câu trả lời của jAndy.
Paulo Coghi - Tái lập Monica

5
String.prototype.substrbây giờ không được dùng nữa developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/iêu
Tivie

2
substring trong trường hợp này là sự thay thế trực tiếp cho người bị phản đối substr, vì vậy câu trả lời trở thành : var output = a.substring(0, position) + b + a.substring(position);.
Cá biển

Nó không được phản đối nghiêm ngặt, nhưng di sản, vì vậy một ý tưởng tốt để thay thế vì nó có thể sẽ bị phản đối và được MDN khuyến nghị sử dụng.substring
froggomad

32

Bạn có thể thêm hàm này vào lớp chuỗi

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

để bạn có thể sử dụng nó trên bất kỳ đối tượng chuỗi nào:

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

3
Đó là một thực tế xấu để sửa đổi nguyên mẫu đối tượng bản địa: stackoverflow.com/questions/14034180/
Khăn

10

Sử dụng chuỗi ký tự ES6 , sẽ ngắn hơn nhiều:

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

Có lẽ sẽ tốt hơn nữa nếu bạn xác định vị trí bằng cách sử dụng indexOf () như thế này:

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

sau đó gọi hàm như thế này:

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

Lưu ý rằng tôi đặt một khoảng trắng sau "an" trong lệnh gọi hàm, thay vì trong câu lệnh return.


2
Đây không phải là những gì nó được yêu cầu. Ngay cả khi đây là trường hợp, nó sẽ không hoạt động nếu bạn có nhiều lần xuất hiện của chuỗi con "tại"
elachell

6

Các Underscore.String thư viện có một chức năng nào Insert

chèn (chuỗi, chỉ mục, chuỗi con) => chuỗi

như vậy

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

Không phải bởi tôi, nhưng có lẽ bởi vì không có đề cập đến thư viện đó trong câu hỏi. Nhưng dường như ông cũng không loại trừ các thư viện khác IMO ..
Dennis98

1
Mặc dù tôi không thích sử dụng các thư viện trừ khi cần thiết, tôi đã nâng cấp để bù đắp cho downvote: P
froggomad

3

thử

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

hoặc giải pháp regrec

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


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

Việc này sẽ chậm hơn, nhưng sẽ quan tâm đến việc thêm không gian trước và sau Ngoài ra, bạn sẽ phải thay đổi giá trị của vị trí (thành 2, giờ đây trực quan hơn)


2

Sửa nhanh! Nếu bạn không muốn tự thêm một khoảng trắng, bạn có thể làm điều này:

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

(chỉnh sửa: tôi thấy rằng điều này thực sự được trả lời ở trên, xin lỗi!)


2

Nếu giao diện của ES2018 khả dụng , một giải pháp regrec nữa, sử dụng nó để "thay thế" ở vị trí có độ rộng bằng 0 sau ký tự Nth (tương tự như @Kamil Kiełczewski, nhưng không lưu trữ các ký tự ban đầu trong nhóm bắt giữ):

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


1

Vâng chỉ là một thay đổi nhỏ 'gây ra các kết quả giải pháp trên

"Tôi muốn một quả táo"

thay vì

"Tôi muốn một quả táo"

Để có được đầu ra như

"Tôi muốn một quả táo"

sử dụng mã sửa đổi sau

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

13
vâng, nó có lẽ không mong muốn trong này trường hợp, nhưng thêm một không gian thêm tự động là gần như chắc chắn không mong muốn trong tất cả các trường hợp.
nickf

12
Các giải pháp chính xác sẽ không phải là thêm các khoảng trắng trong chuỗi = 'an', bằng cách này bạn có thể sử dụng lại hàm
Tosh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.