Вставка строки в позицию x другой строки

237

У меня есть две переменные, и мне нужно вставить строку bв строку aв точке, представленной position. В результате я ищу "Я хочу яблоко". Как я могу сделать это с помощью JavaScript?

var a = 'I want apple';
var b = ' an';
var position = 6;
Sami
источник

Ответы:

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

JANDY
источник
3
Для длинных строк это решение быстрее (потому что оно копирует меньше), чем решение Никфа.
очко
35
Это решение не быстрее. Мне было любопытно об этом и побежал jsperf. Это примечание для тех, кто читает это в будущем. jsperf.com/javascript-string-splice . Протестировано в последней версии FF / Chrome / IE10 / IE9. Я бы использовал подход Lean Nickf над этим для ясности и производительности.
Junkyspace
3
Ну, это очень возможно. Ответ здесь почти 3 года, большинство браузеров и версий тогда действительно работали намного быстрее с объединением массива (особенно IE).
Джэнди
1
Прошу прощения, что возродил такой старый вопрос, но для того, чтобы я того стоил, нужно var output = [a.slice(0, position + 1), b, a.slice(position)].join('');дать ОП «Я хочу яблоко», а не «Я хочу яблоко».
paulvs
13
@PaulVon Это никогда не неправильно, чтобы исправить что-то, так что не нужно прощения. Во всяком случае, я не согласен. Функционально делает то, что намеревался сделать, вставляя строку в определенную позицию в другой строке. На самом деле вставленная строка должна быть как «an», что было бы более правильным в этом случае.
Джэнди
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 )

nickf
источник
47
Согласно @junkyspace jsperf.com/javascript-string-splice , этот ответ в 640 раз быстрее, чем у jAndy.
Пауло Коги - Восстановить Монику
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);.
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");
jasin_89
источник
3
Неправильно
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");

Обратите внимание, что я ставлю пробел после «an» в вызове функции, а не в операторе return.

paulo62
источник
2
Это не то, что было задано. Даже если бы это было так, это не сработало бы, если у вас есть несколько вхождений подстроки «at»
elachell
6

Библиотека Underscore.String имеет функцию вставки

вставить (строка, индекс, подстрока) => строка

вот так

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

dlauzon
источник
1

Ну просто небольшое изменение, потому что вышеприведенное решение выводит

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

вместо того

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

Чтобы получить вывод как

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

используйте следующий модифицированный код

var output = a.substr(0, position) + " " + b + a.substr(position);
Клайд Лобо
источник
13
да, это, вероятно, нежелательно в этом случае, но автоматическое добавление дополнительного пробела почти наверняка не желательно во всех случаях.
Ник
12
Разве правильными решениями не было бы добавить пробелы в строке = 'an', таким образом, вы можете повторно использовать функцию
Tosh