Вставить строку по определенному индексу - PullRequest
270 голосов
/ 30 ноября 2010

Как я могу вставить строку по определенному индексу другой строки?

 var txt1 = "foo baz"

Предположим, я хочу вставить "bar" после "foo", как мне этого добиться?

Я думал о substring(), но должен быть более простой, более прямойспособ.

Ответы [ 17 ]

341 голосов
/ 30 ноября 2010

Вставка по определенному индексу (а не, скажем, по первому пробелу) должна использовать нарезку строк / подстроку:

var txt2 = txt1.slice(0, 3) + "bar" + txt1.slice(3);
231 голосов
/ 30 ноября 2010

Вы можете создать свой собственный splice() в String.

Polyfill

if (!String.prototype.splice) {
    /**
     * {JSDoc}
     *
     * The splice() method changes the content of a string by removing a range of
     * characters and/or adding new characters.
     *
     * @this {String}
     * @param {number} start Index at which to start changing the string.
     * @param {number} delCount An integer indicating the number of old chars to remove.
     * @param {string} newSubStr The String that is spliced in.
     * @return {string} A new string with the spliced substring.
     */
    String.prototype.splice = function(start, delCount, newSubStr) {
        return this.slice(0, start) + newSubStr + this.slice(start + Math.abs(delCount));
    };
}

Пример

String.prototype.splice = function(idx, rem, str) {
    return this.slice(0, idx) + str + this.slice(idx + Math.abs(rem));
};

var result = "foo baz".splice(4, 0, "bar ");

document.body.innerHTML = result; // "foo bar baz"

РЕДАКТИРОВАТЬ: Модифицировано, чтобы rem было абсолютным значением.

127 голосов
/ 06 февраля 2012

Попробуй это.Вот метод, который я написал, который ведет себя как все другие языки программирования.

String.prototype.insert = function (index, string) {
  if (index > 0)
    return this.substring(0, index) + string + this.substring(index, this.length);

  return string + this;
};

Пример использования:

var something = "How you?";
something = something.insert(3, " are");

Simples.

Ссылка: http://coderamblings.wordpress.com/2012/07/09/insert-a-string-at-a-specific-index/

63 голосов
/ 21 апреля 2014

Просто сделайте следующую функцию:

function insert(str, index, value) {
    return str.substr(0, index) + value + str.substr(index);
}

, а затем используйте его так:

alert(insert("foo baz", 4, "bar "));

Вывод: foo bar baz

Он ведет себя точно так же, как C # (Sharp) String.Insert (int startIndex, строковое значение).

ПРИМЕЧАНИЕ: Эта функция вставки вставляет строку значение (третий параметр) перед указанным целым числом index (второй параметр) в строка str (первый параметр), а затем возвращает новую строку без изменения str !

15 голосов
/ 19 ноября 2012

ОБНОВЛЕНИЕ 2016: Вот еще одна просто для удовольствия (но более серьезная!) Функция-прототип, основанная на однострочном RegExp подходе (с предварительной поддержкой на undefined или отрицательным index):

/**
 * Insert `what` to string at position `index`.
 */
String.prototype.insert = function(what, index) {
    return index > 0
        ? this.replace(new RegExp('.{' + index + '}'), '$&' + what)
        : what + this;
};

console.log( 'foo baz'.insert('bar ', 4) );  // "foo bar baz"
console.log( 'foo baz'.insert('bar ')    );  // "bar foo baz"

Предыдущий (назад к 2012) просто для удовольствия решение:

var index = 4,
    what  = 'bar ';

'foo baz'.replace(/./g, function(v, i) {
    return i === index - 1 ? v + what : v;
});  // "foo bar baz"
10 голосов
/ 24 октября 2014

Это в основном то, что делает @ Bass33, за исключением того, что я также даю возможность использовать отрицательный индекс для подсчета с конца. Вроде как метод substr позволяет.

// use a negative index to insert relative to the end of the string.

String.prototype.insert = function (index, string) {
  var ind = index < 0 ? this.length + index  :  index;
  return  this.substring(0, ind) + string + this.substring(ind, this.length);
};

Вариант использования: Допустим, у вас есть полноразмерные изображения с использованием соглашения об именах, но вы не можете обновить данные, чтобы также предоставить URL-адреса миниатюр.

var url = '/images/myimage.jpg';
var thumb = url.insert(-4, '_thm');

//    result:  '/images/myimage_thm.jpg'
10 голосов
/ 15 августа 2014

Если кто-то ищет способ вставить текст с несколькими индексами в строку, попробуйте это:

String.prototype.insertTextAtIndices = function(text) {
    return this.replace(/./g, function(character, index) {
        return text[index] ? text[index] + character : character;
    });
};

Например, вы можете использовать это для вставки тегов <span> с определенными смещениями в строку:

var text = {
    6: "<span>",
    11: "</span>"
};

"Hello world!".insertTextAtIndices(text); // returns "Hello <span>world</span>!"
9 голосов
/ 24 декабря 2015
my_string          = "hello world";
my_insert          = " dear";
my_insert_location = 5;

my_string = my_string.split('');  
my_string.splice( my_insert_location , 0, my_insert );
my_string = my_string.join('');

https://jsfiddle.net/gaby_de_wilde/wz69nw9k/

7 голосов
/ 30 ноября 2010

Учитывая ваш текущий пример, вы можете достичь результата либо

var txt2 = txt1.split(' ').join(' bar ')

или

var txt2 = txt1.replace(' ', ' bar ');

но, учитывая, что вы можете делать такие предположения, вы можете также перейти непосредственно к примеру Гуллена.

В ситуации, когда вы действительно не можете делать никаких предположений, кроме основанных на индексе символов, тогда я действительно выбрал бы решение для подстроки.

5 голосов
/ 14 сентября 2015
function insertString(string, insertion, place) {
  return string.replace(string[place] + string[place + 1], string[place] + insertion + string[place + 1])
}

Итак, для вас это будет insertString("foo baz", "bar", 3);

Очевидно, это будет краска, которую нужно использовать, потому что вы должны каждый раз вводить свою строку в функцию, но в настоящий момент я не знаю, как превратить ее во что-то более простое, например string.replace(insertion, place). Однако идея остается в силе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...