Как заменить символ по определенному индексу в JavaScript? - PullRequest
465 голосов
/ 16 сентября 2009

У меня есть строка, скажем, Hello world, и мне нужно заменить символ в индексе 3. Как я могу заменить символ, указав индекс?

var str = "hello world";

Мне нужно что-то вроде

str.replaceAt(0,"h");

Ответы [ 22 ]

537 голосов
/ 16 сентября 2009

В JavaScript строки неизменны , что означает, что лучшее, что вы можете сделать, - это создать новую строку с измененным содержимым и назначить переменную, указывающую на нее.

Вам нужно определить функцию replaceAt() самостоятельно:

String.prototype.replaceAt=function(index, replacement) {
    return this.substr(0, index) + replacement+ this.substr(index + replacement.length);
}

И используйте это так:

var hello="Hello World";
alert(hello.replaceAt(2, "!!")); //should display He!!o World
81 голосов
/ 16 сентября 2009

В JavaScript нет функции replaceAt. Вы можете использовать следующий код для замены любого символа в любой строке в указанной позиции:

function rep() {
    var str = 'Hello World';
    str = setCharAt(str,4,'a');
    alert(str);
}

function setCharAt(str,index,chr) {
    if(index > str.length-1) return str;
    return str.substr(0,index) + chr + str.substr(index+1);
}
<button onclick="rep();">click</button>
57 голосов
/ 16 сентября 2009

Вы не можете. Возьмите символы до и после позиции и добавьте новую строку:

var s = "Hello world";
var index = 3;
s = s.substr(0, index) + 'x' + s.substr(index + 1);
29 голосов
/ 19 июля 2013

Здесь много ответов, и все они основаны на двух методах:

  • МЕТОД1: разбить строку, используя две подстроки, и вставить символ между ними
  • МЕТОД 2: преобразовать строку в массив символов, заменить один элемент массива и присоединиться к нему

Лично я бы использовал эти два метода в разных случаях. Позвольте мне объяснить.

@ FabioPhms: Ваш метод был тем, который я использовал изначально, и я боялся, что он плох для строки с большим количеством символов. Тем не менее, вопрос в том, что много персонажей? Я проверил это на 10 параграфах "lorem ipsum", и это заняло несколько миллисекунд. Затем я проверил это на 10-кратной струне - не было большой разницы. Hm.

@ vsync, @Cory Mawhorter: Ваши комментарии однозначны; однако, опять же, что такое большая строка? Я согласен, что для 32 ... 100 КБ производительность должна быть лучше, и для этой операции замены символов следует использовать substring-вариант.

Но что произойдет, если мне придется сделать довольно много замен?

Мне нужно было провести свои собственные тесты, чтобы доказать, что быстрее в этом случае. Допустим, у нас есть алгоритм, который будет манипулировать относительно короткой строкой, состоящей из 1000 символов. Мы ожидаем, что в среднем каждый символ в этой строке будет заменен ~ 100 раз. Итак, код для проверки чего-то вроде этого:

var str = "... {A LARGE STRING HERE} ...";

for(var i=0; i<100000; i++)
{
  var n = '' + Math.floor(Math.random() * 10);
  var p = Math.floor(Math.random() * 1000);
  // replace character *n* on position *p*
}

Я создал для этого скрипку, а здесь . Существует два теста: TEST1 (подстрока) и TEST2 (преобразование массива).

Результаты:

  • ТЕСТ1: 195мс
  • ТЕСТ2: 6 мс

Кажется, преобразование массива превосходит подстроку на 2 порядка! Итак - что, черт возьми, здесь произошло ???

На самом деле происходит то, что все операции в TEST2 выполняются над самим массивом с использованием выражения присваивания, например strarr2[p] = n. Назначение действительно быстрое по сравнению с подстрокой в ​​большой строке, и ясно, что оно победит.

Итак, все дело в выборе правильного инструмента для работы. Опять же.

28 голосов
/ 12 сентября 2011

Работа с векторами обычно наиболее эффективна для связи со String.

Я предлагаю следующую функцию:

String.prototype.replaceAt=function(index, char) {
    var a = this.split("");
    a[index] = char;
    return a.join("");
}

Запустить этот фрагмент:

String.prototype.replaceAt=function(index, char) {
    var a = this.split("");
    a[index] = char;
    return a.join("");
}

var str = "hello world";
str = str.replaceAt(3, "#");

document.write(str);
26 голосов
/ 16 сентября 2009

В Javascript строки являются неизменяемыми, поэтому вы должны сделать что-то вроде

var x = "Hello world"
x = x.substring(0, i) + 'h' + x.substring(i+1);

Чтобы заменить символ в x в i на 'h'

25 голосов
/ 30 октября 2014
str = str.split('');
str[3] = 'h';
str = str.join('');
5 голосов
/ 15 мая 2017

function dothis() {
  var x = document.getElementById("x").value;
  var index = document.getElementById("index").value;
  var text = document.getElementById("text").value;
  var arr = x.split("");
  arr.splice(index, 1, text);
  var result = arr.join("");
  document.getElementById('output').innerHTML = result;
  console.log(result);
}
dothis();
<input id="x" type="text" value="White Dog" placeholder="Enter Text" />
<input id="index" type="number" min="0"value="6" style="width:50px" placeholder="index" />
<input id="text" type="text" value="F" placeholder="New character" />
<br>
<button id="submit" onclick="dothis()">Run</button>
<p id="output"></p>

Этот метод хорош для небольших строк, но может быть медленным для большого текста.

var x = "White Dog";
var arr = x.split(""); // ["W", "h", "i", "t", "e", " ", "D", "o", "g"]
arr.splice(6, 1, 'F');
var result = arr.join(""); // "White Fog"

/* 
  Here 6 is starting index and 1 is no. of array elements to remove and 
  final argument 'F' is the new character to be inserted. 
*/
5 голосов
/ 11 августа 2017

Однострочное использование String.replace с обратным вызовом (без поддержки Emoji):

// 0 - index to replace, 'f' - replacement string
'dog'.replace(/./g, (c, i) => i == 0? 'f': c)
// "fog"

Разъяснения:

//String.replace will call the callback on each pattern match
//in this case - each character
'dog'.replace(/./g, function (character, index) {
   if (index == 0) //we want to replace the first character
     return 'f'
   return character //leaving other characters the same
})
3 голосов
/ 02 марта 2013

Это работает аналогично Array.splice:

String.prototype.splice = function (i, j, str) {
    return this.substr(0, i) + str + this.substr(j, this.length);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...