Вставлення рядка в позиції 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
Для довгих рядків це рішення швидше (оскільки воно копіює менше), ніж рішення Нікфа.
пт

35
Це рішення не швидше. Мені було цікаво з цього приводу і побіг jsperf. Це примітка для кожного, хто читає це в майбутньому. jsperf.com/javascript-string-splice . Тестовано в останніх FF / Chrome / IE10 / IE9. Я використовував би підхід нікефа над цим, і для ясності, і для продуктивності.
junkyspace

3
Ну, це дуже можливо. Відповіді тут майже три роки, більшість браузерів та версій тоді справді виконувались набагато швидше, коли Array приєднувався (особливо IE).
jAndy

1
Прошу пробачення, що я відновив таке давнє запитання, але для того, що я вартий, варто var output = [a.slice(0, position + 1), b, a.slice(position)].join('');дати ОП «Я хочу яблуко», а не «Я хочу яблуко».
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 - Відновіть Моніку

5
String.prototype.substrзараз застаріло. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Tivie

2
substring в цьому випадку є прямою заміною для застарілого substr, так що відповідь буде: var output = a.substring(0, position) + b + a.substring(position);.
морські рибки

Це не суворо застаріле, але застаріле, тому гарну ідею замінити, оскільки вона, ймовірно, застаріла, і рекомендується 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

10

Використання рядкових літералів ES6 було б набагато коротшим:

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

Можливо, це ще краще, якщо визначити позицію, використовуючи 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");

Зауважте, що я розміщую пробіл після "а" у виклику функції, а не в операторі return.


2
Це не те, що просили. Навіть якби це було так, це не спрацювало, якщо у вас є кілька випадків підрядки "at"
elachell

6

Бібліотека Underscore.String має функцію, яка виконує Insert

insert (рядок, індекс, підряд) => рядок

як так

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

Не мною, але, мабуть, тому, що про цю бібліотеку в питанні не було згадок. Але він також, схоже, не виключає інших бібліотек IMO ..
Dennis98

1
Незважаючи на те, що мені не подобається використовувати бібліотеки, якщо це не потрібно, я висловився за компенсацію низового звороту: P
froggomad

3

спробуйте

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

або розчин повторного виведення

"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

Якщо перегляд назад ES2018 є доступний , один більш регулярним виразом рішення, яке використовує його , щоб «замінити» на нульову ширину позиції після символу N - го ( по аналогії з @Kamil Kiełczewski, але без збереження вихідних символів в захопленні групи):

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


1

Ну просто невелика зміна викликає вищезазначені результати

"Я хочу анапл"

замість

"Я хочу яблуко"

Щоб отримати вихід як

"Я хочу яблуко"

використовувати наступний модифікований код

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

13
так, це, мабуть, не бажано в цьому випадку, але автоматично додавати додатковий простір майже напевно не бажано у всіх випадках.
nickf

12
Чи не правильним рішенням буде додавання пробілів у рядку = 'an', таким чином ви можете повторно використовувати функцію
Tosh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.