Как мне заменить символ по определенному индексу в JavaScript?
-
07-07-2019 - |
Вопрос
Скажем, у меня есть строка Hello world
и мне нужно заменить символ с индексом 3.Как я могу заменить символ, указав индекс?
var str = "hello world";
Мне нужно что-то вроде
str.replaceAt(0,"h");
Решение
В 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
Другие советы
Там нет никакого 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);
Здесь есть много ответов, и все они основаны на двух методах:
- СПОСОБ1:разделите строку, используя две подстроки, и вставьте символ между ними
- МЕТОД2:преобразуйте строку в массив символов, замените один элемент массива и присоедините его
Лично я бы использовал эти два метода в разных случаях.Позвольте мне объяснить.
@FabioPhms:Ваш метод был тем, который я изначально использовал, и я боялся, что он плох для строки с большим количеством символов.Однако вопрос в том, что значит много персонажей?Я протестировал это на 10 абзацах "lorem ipsum", и это заняло несколько миллисекунд.Затем я протестировал это на строке в 10 раз большего размера - на самом деле большой разницы не было.Хм.
@vsync, @Кори Мавхортер:Ваши комментарии недвусмысленны;однако, опять же, что такое большая строка?Я согласен, что для 32 ... 100 кб производительность должна быть лучше, и для этой операции замены символов следует использовать 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 (преобразование массива).
Результаты:
- ТЕСТ1:195мс
- ТЕСТ2:6 мс
Кажется, что преобразование массива превосходит подстроку на 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.
*/
Однострочник с использованием 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
})
@CemKalyoncu: спасибо за отличный ответ!
Я также немного адаптировал его, чтобы сделать его более похожим на метод Array.splice (и учел примечание @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!"
Это работает аналогично Array.splice
:
String.prototype.splice = function (i, j, str) {
return this.substr(0, i) + str + this.substr(j, this.length);
};
Если вы хотите заменить символы в строке, вы должны создать изменяемые строки. По сути, это массивы символов. Вы можете создать фабрику:
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!"
Вы можете попробовать
var strArr = str.split("");
strArr[0] = 'h';
str = strArr.join("");
Я сделал функцию, которая делает нечто похожее на то, что вы спрашиваете, он проверяет, находится ли символ в строке в массиве недопустимых символов, если он заменяет его на ''
var validate = function(value){
var notAllowed = [";","_",">","<","'","%","<*>quot;,"&","/","|",":","=","*"];
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;
}
Я знаю, что это старо, но решение не работает для отрицательного индекса, поэтому я добавляю к нему патч. надеюсь, это поможет кому-то
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);
}
Допустим, вы хотите заменить индекс Kth
(индекс на основе 0) на 'Z'
.
Вы можете использовать Regex
для этого.
var re = var re = new RegExp("((.){" + K + "})((.){1})")
str.replace(re, "$1A Допустим, вы хотите заменить индекс Kth
(индекс на основе 0) на 'Z'
.
Вы можете использовать Regex
для этого.
");
это легко достижимо с помощью RegExp!
const str = 'Hello RegEx!';
const index = 11;
const replaceWith = 'p';
//'Hello RegEx!'.replace(/^(.{11})(.)/, `$1p`);
str.replace(new RegExp(`^(.{${ index }})(.)`), `$1${ replaceWith }`);
//< "Hello RegExp"
Вот версия, которую я придумал, если вы хотите стилизовать слова или отдельные символы по их индексу в реакции / javascript.
replaceAt( yourArrayOfIndexes, yourString/orArrayOfStrings )
Рабочий пример: https://codesandbox.io/s/ov7zxp9mjq
function replaceAt(indexArray, [...string]) {
const replaceValue = i => string[i] = <b>{string[i]}</b>;
indexArray.forEach(replaceValue);
return string;
}
А вот еще один альтернативный метод
function replaceAt(indexArray, [...string]) {
const startTag = '<b>';
const endTag = '</b>';
const tagLetter = i => string.splice(i, 1, startTag + string[i] + endTag);
indexArray.forEach(tagLetter);
return string.join('');
}
И еще один ...
function replaceAt(indexArray, [...string]) {
for (let i = 0; i < indexArray.length; i++) {
string = Object.assign(string, {
[indexArray[i]]: <b>{string[indexArray[i]]}</b>
});
}
return string;
}
Обобщая ответ Афанасия Куракина, мы имеем:
function replaceAt(str, index, ch) {
return str.replace(/./g, (c, i) => i == index ? ch : c)
}
let str = 'Hello World'
str = replaceAt(str, 1, 'u')
console.log(str) // Hullo World
Давайте расширим и объясним как регулярное выражение, так и функцию замены:
function replaceAt(str, index, newChar) {
function replacer(origChar, strIndex) {
if (strIndex === index)
return newChar
else
return origChar
}
return str.replace(/./g, replacer)
}
let str = 'Hello World'
str = replaceAt(str, 1, 'u')
console.log(str) // Hullo World
Регулярное выражение .
соответствует ровно одному символу.Тот Самый g
заставляет его соответствовать каждому символу в цикле for.Тот Самый replacer
функция вызывается с учетом как исходного символа, так и индекса того, где этот символ находится в строке.Мы делаем простой if
заявление, чтобы определить, собираемся ли мы вернуться либо origChar
или newChar
.
Вы можете расширить строковый тип, включив в него метод inset:
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 "));
Затем вы можете вызвать функцию:
Вы можете использовать следующую функцию для замены Character
или String
в определенном положении строки.Чтобы заменить все следующие варианты совпадения, используйте String.prototype.replaceAllMatches()
функция.
String.prototype.replaceMatch = function(matchkey, replaceStr, matchIndex) {
var retStr = this, repeatedIndex = 0;
for (var x = 0; (matchkey != null) && (retStr.indexOf(matchkey) > -1); x++) {
if (repeatedIndex == 0 && x == 0) {
repeatedIndex = retStr.indexOf(matchkey);
} else { // matchIndex > 0
repeatedIndex = retStr.indexOf(matchkey, repeatedIndex + 1);
}
if (x == matchIndex) {
retStr = retStr.substring(0, repeatedIndex) + replaceStr + retStr.substring(repeatedIndex + (matchkey.length));
matchkey = null; // To break the loop.
}
}
return retStr;
};
Тест:
var str = "yash yas $dfdas.**";
console.log('Index Matched replace : ', str.replaceMatch('as', '*', 2) );
console.log('Index Matched replace : ', str.replaceMatch('y', '~', 1) );
Выходной сигнал:
Index Matched replace : yash yas $dfd*.**
Index Matched replace : yash ~as $dfdas.**
Методы здесь сложны. Я бы сделал это так:
var myString = "this is my string";
myString = myString.replace(myString.charAt(number goes here), "insert replacement here");
Это так просто, как только можно.