首页 文章

如何在JavaScript中替换特定索引处的字符?

提问于
浏览
447

我有一个字符串,让我们说 Hello world 并且我需要替换索引3处的char . 如何通过指定索引来替换char?

var str = "hello world";

我需要类似的东西

str.replaceAt(0,"h");

21 回答

  • -1

    我知道这是旧的,但解决方案不适用于负面索引,所以我添加了一个补丁 . 希望它可以帮到某人

    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);
    
    }
    
  • 0

    假设您要将 Kth index(基于0的索引)替换为 'Z' . 您可以使用 Regex 来执行此操作 .

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

    你可以试试

    var strArr = str.split("");
    
    strArr[0] = 'h';
    
    str = strArr.join("");
    
  • 0

    在JavaScript中,字符串是 immutable ,这意味着您可以做的最好的事情是创建一个包含更改内容的新字符串,并指定变量指向它 .

    您需要自己定义 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
    
  • 4

    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>
    
  • 2

    你不能 . 取位置前后的字符并连接成一个新字符串:

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

    这里有很多答案,所有答案都基于两种方法:

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

    我为此创造了一个小提琴,它是here . 有两个测试,TEST1(子串)和TEST2(阵列转换) .

    结果:

    • TEST1:195ms

    • TEST2:6ms

    似乎数组转换比子串要好2个数量级!那么 - 到底发生了什么?

    实际发生的是TEST2中的所有操作都是在数组本身完成的,使用 strarr2[p] = n 之类的赋值表达式 . 与大字符串上的子字符串相比,赋值真的很快,而且很明显它会赢 .

    所以,这就是为工作选择合适的工具 . 再次 .

  • 29

    使用矢量通常最有效地联系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);
    
  • 510
    str = str.split('');
    str[3] = 'h';
    str = str.join('');
    
  • 1

    在Javascript字符串是不可变的,所以你必须做类似的事情

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

    用'h'替换i中x的字符

  • 1
    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. 
    */
    
  • 25

    使用带回调的String.replace的单线程(没有表情符号支持):

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

    这类似于 Array.splice

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

    @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!"
    
  • 1

    我做了一个类似于你所要求的函数的函数,它检查字符串中的字符是否在一个不允许的字符数组中,如果它用''替换它''

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

    如果要替换字符串中的字符,则应创建可变字符串 . 这些本质上是字符数组 . 你可以创建一个工厂:

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

    如果您想在索引处设置单词或单个字符的样式,这是我想出的一个版本 .

    replaceAt( yourArrayOfIndexes, yourString/orArrayOfStrings )
    

    工作示例:https://codesandbox.io/s/pjp6jk48jj

    function replaceAt(indexArray, string) {
      const newString = [...string];
      const replaceValue = i => (newString[i] = <b>{newString[i]}</b>);
      indexArray.map(replaceValue);
      return newString;
    }
    

    这是另一种替代方法

    function replaceAt(indexArray, inputString) {
      const string = [...inputString];
      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) {
      let newString = [...string];
    
      for (let i = 0; i < indexArray.length; i++) {
        newString = Object.assign(newString, {
          [indexArray[i]]: <b>{newString[indexArray[i]]}</b>
        });
      }
    
      return newString;
    }
    
  • -4

    使用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"
    
  • 53

    您可以扩展字符串类型以包含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 "));
    

    然后你可以调用这个函数:

  • 0

    您可以使用以下函数在String的特定位置替换 CharacterString . 要替换以下所有匹配情况,请使用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.**
    
  • 27

    这里的方法很复杂 . 我会这样做:

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

    这很简单 .

相关问题