Как заменить символ в определенном индексе в JavaScript?

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

var str = "hello world";

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

str.replaceAt(0,"h");

17 ответов


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

вам нужно будет определить


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

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>

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

var s = "Hello world";
var index = 3;
s = s.substr(0, index) + 'x' + s.substr(index + 1);

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

  • METHOD1: разделите строку с помощью двух подстрок и вставьте символ между ними
  • METHOD2: преобразуйте строку в массив символов, замените один член массива и присоединитесь к нему

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

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

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

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

мне нужно было выполнить мои собственные тесты, чтобы доказать, что в этом случае быстрее. Предположим, у нас есть алгоритм, который будет манипулировать относительно короткой строкой, состоящей из 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 (преобразование массива).

результаты:

  • TEST1: 195ms
  • TEST2: 6ms

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

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

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


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

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

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

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

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

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


str = str.split('');
str[3] = 'h';
str = str.join('');

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. 
*/

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

String.prototype.splice = function (i, j, str) {
    return this.substr(0, i) + str + this.substr(j, this.length);
};

однострочный с использованием строки.заменить на обратный вызов:

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

@CemKalyoncu: Спасибо за отличный ответ!

Я также немного адаптировал его, чтобы сделать его более похожим на массив.метод соединения (и принял во внимание Примечание @Ates):

spliceString=function(string, index, numToDelete, char) {
      return string.substr(0, index) + char + string.substr(index+numToDelete);
   }

var myString="hello world!";
spliceString(myString,myString.lastIndexOf('l'),2,'mhole'); // "hello wormhole!"

Я сделал функцию, которая делает что-то похожее на то, что вы спрашиваете, она проверяет, находится ли символ в строке в массиве недопустимых символов, если он заменяет его на "

    var validate = function(value){
        var notAllowed = [";","_",">","<","'","%","$","&","/","|",":","=","*"];
        for(var i=0; i<value.length; i++){
            if(notAllowed.indexOf(value.charAt(i)) > -1){
               value = value.replace(value.charAt(i), "");
               value = validate(value);
            }
       }
      return value;
   }

Если вы хотите заменить символы в строке, вы должны создать изменяемые строки. Это, по сути, массивы символов. Вы можете создать фабрику:

  function MutableString(str) {
    var result = str.split("");
    result.toString = function() {
      return this.join("");
    }
    return result;
  }

затем вы можете получить доступ к символам и весь массив преобразуется в строку при использовании в качестве строки:

  var x = MutableString("Hello");
  x[0] = "B"; // yes, we can alter the character
  x.push("!"); // good performance: no new string is created
  var y = "Hi, "+x; // converted to string: "Hi, Bello!"

Я знаю, что это старый, но решение не работает для отрицательного индекса, поэтому я добавляю к нему патч. надеюсь, это поможет кому-то

String.prototype.replaceAt=function(index, character) {
    if(index>-1) return this.substr(0, index) + character + this.substr(index+character.length);
    else return this.substr(0, this.length+index) + character + this.substr(index+character.length);

}

вы можете расширить тип строки, чтобы включить метод вставки:

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

var s = "new function";
alert(s.insert(4,"insert string "));

затем вы можете вызвать функцию:


Допустим, вы хотите заменить Kth index (индекс на основе 0) с 'Z'. Вы могли бы использовать Regex для этого.

var re = var re = new RegExp("((.){" + K + "})((.){1})")
str.replace(re, "A$`");

методы здесь сложны. Я бы сделал это так:

var myString = "this is my string";
myString = myString.replace(myString.charAt(number goes here), "insert replacement here");

Это так просто, как он получает.