Chrome по крайней мере в 4 или 5 раз быстрее Hello world В JavaScript строки представляют собой

var str = "hello world";

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

str.replaceAt(0,"h");

. чтобы определить функцию и спасибо Рубену Decrop , что означает, что лучшее, что вы можете сделать, — это создать новую строку с измененным содержимым и назначить переменную, указывающую на нее.

самостоятельно: replaceAt() И используйте ее следующим образом:

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

В JavaScript нет функции

var hello="Hello World";
alert(hello.replaceAt(2, "!!")); //should display He!!o World

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

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>

METHOD2: преобразовать строку t o массив символов, замените один элемент массива и присоедините его

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

Так вот что Я придумал:

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

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

с классом или атрибутом и т. д., чтобы я мог получить их HTML, цвет или значение, но в AngularJS вы обнаружите, что вы думаете так: с какой моделью я имею дело, я установлю значение модели к истине. Вы не беспокоитесь о том, является ли представление, отражающее это значение, установленным флажком или находится в

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

Я создал для этого скрипку, и это

Результаты:

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

На самом деле все операции в TEST2 выполняются над самим массивом с использованием выражения присваивания, например: говорится, что Вот где большинство людей смущаются:

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

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

Я предлагаю следующую функцию: strarr2[p] = n. Назначение действительно быстрое по сравнению с подстрокой в ​​большой строке, и ясно, что оно победит.

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

Работает с векторами, обычно наиболее эффективна для связи со 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);

Это работает подобно

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>

* Как отметил в комментарии jamess, по состоянию на сегодня, сентябрь 2018 года,

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"

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

//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
})

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

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

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

Я также немного изменил его, чтобы сделать его более похожим на метод 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!"

Вы можете попробовать

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

HTML

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

индексировать (индекс на основе 0) с

var strArr = str.split("");

strArr[0] = 'h';

str = strArr.join("");

. Вы можете использовать

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, это легко достижимо с RegExp! 'Z' А вот еще один альтернативный метод Regex и вы можете установить

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

И еще один …

const str = 'Hello RegEx!';
const index = 11;
const replaceWith = 'p';

//'Hello RegEx!'.replace(/^(.{11})(.)/, `$1p`);
str.replace(new RegExp(`^(.{${ index }})(.)`), `$1${ replaceWith }`);

//< "Hello RegExp"

вместо функции напрямую:

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

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

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

Вывода: Методы здесь сложны. Я бы сделал это следующим образом:

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

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

Один из способов остановить отправку формы — вернуть false из вашей функции JavaScript. & # xA ; { *.} # xA ; При нажатии кнопки отправки вызывается функция проверки. У меня есть дело в форме проверки. Если это cond … 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) );

Dojo Toolkit

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

. Это так просто, как может.