当前位置 : 首页 » 互动问答 » 正文

How do I replace a character at a particular index in JavaScript?

分类 : 互动问答 | 发布时间 : 2009-09-16 13:21:22 | 评论 : 20 | 浏览 : 412459 | 喜欢 : 436

I have a string, let's say Hello world and I need to replace the char at index 3. How can I replace a char by specifying a index?

var str = "hello world";

I need something like

str.replaceAt(0,"h");

回答(20)

  • 1楼
  • In JavaScript, strings are immutable, which means the best you can do is create a new string with the changed content, and assign the variable to point to it.

    You'll need to define the replaceAt() function yourself:

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

    And use it like this:

    var hello="Hello World";
    alert(hello.replaceAt(2, "!!")); //should display He!!o World
    
  • 2楼
  • There is no replaceAt function in JavaScript. You can use the following code to replace any character in any string at specified position:

    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>

  • 3楼
  • You can't. Take the characters before and after the position and concat into a new string:

    var s = "Hello world";
    var index = 3;
    s = s.substr(0, index) + 'x' + s.substr(index + 1);
    
  • 4楼
  • There are lot of answers here, and all of them are based on two methods:

    • METHOD1: split the string using two substrings and stuff the character between them
    • METHOD2: convert the string to character array, replace one array member and join it

    Personally, I would use these two methods in different cases. Let me explain.

    @FabioPhms: Your method was the one I initially used and I was afraid that it is bad on string with lots of characters. However, question is what's a lot of characters? I tested it on 10 "lorem ipsum" paragraphs and it took a few milliseconds. Then I tested it on 10 times larger string - there was really no big difference. Hm.

    @vsync, @Cory Mawhorter: Your comments are unambiguous; however, again, what is a large string? I agree that for 32...100kb performance should better and one should use substring-variant for this one operation of character replacement.

    But what will happen if I have to make quite a few replacements?

    I needed to perform my own tests to prove what is faster in that case. Let's say we have an algorithm that will manipulate a relatively short string that consists of 1000 characters. We expect that in average each character in that string will be replaced ~100 times. So, the code to test something like this is:

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

    I created a fiddle for this, and it's here. There are two tests, TEST1 (substring) and TEST2 (array conversion).

    Results:

    • TEST1: 195ms
    • TEST2: 6ms

    It seems that array conversion beats substring by 2 orders of magnitude! So - what the hell happened here???

    What actually happens is that all operations in TEST2 are done on array itself, using assignment expression like strarr2[p] = n. Assignment is really fast compared to substring on a large string, and its clear that it's going to win.

    So, it's all about choosing the right tool for the job. Again.

  • 5楼
  • Work with vectors is usually most effective to contact String.

    I suggest the following function:

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

    Run this snippet:

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

  • 6楼
  • In Javascript strings are immutable so you have to do something like

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

    To replace the character in x at i with 'h'

  • 7楼
  • str = str.split('');
    str[3] = 'h';
    str = str.join('');
    
  • 8楼
  • 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>

    This method is good for small length strings but may be slow for larger text.

    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. 
    */
    
  • 9楼
  • This works similar to Array.splice:

    String.prototype.splice = function (i, j, str) {
        return this.substr(0, i) + str + this.substr(j, this.length);
    };
    
  • 10楼
  • One-liner using String.replace with callback (no emoji support):

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

    Explained:

    //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
    })
    
  • 11楼
  • @CemKalyoncu: Thanks for the great answer!

    I also adapted it slightly to make it more like the Array.splice method (and took @Ates' note into consideration):

    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!"
    
  • 12楼
  • I did a function that does something similar to what you ask, it checks if a character in string is in an array of not allowed characters if it is it replaces it with ''

        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;
       }
    
  • 13楼
  • I know this is old but the solution does not work for negative index so I add a patch to it. hope it helps someone

    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);
    
    }
    
  • 14楼
  • If you want to replace characters in string, you should create mutable strings. These are essentially character arrays. You could create a factory:

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

    Then you can access the characters and the whole array converts to string when used as string:

      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!"
    
  • 15楼
  • You could try

    var strArr = str.split("");
    
    strArr[0] = 'h';
    
    str = strArr.join("");
    
  • 16楼
  • You can extend the string type to include the inset method:

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

    Then you can call the function:

  • 17楼
  • Lets say you want to replace Kth index (0-based index) with 'Z'. You could use Regex to do this.

    var re = var re = new RegExp("((.){" + K + "})((.){1})")
    str.replace(re, "$1A$`");
    
  • 18楼
  • Here is a version I came up with if you want to style words or individual characters at their index.

    replaceAt( yourArrayOfIndexes, yourString/orArrayOfStrings ) 
    

    Working example: https://codesandbox.io/s/lr5zjxrn67

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

    And here is another alternate method

    function replaceAt(indexArray, string) {
      const newString = [...string];
    
      return newString.map(i => {
        indexArray.map(i => {
          return (newString[i] = <b>{newString[i]}</b>);
        });
        return i;
      });
    }
    
  • 19楼
  • You can use the following function to replace Character or String at a particular position of a String. To replace all the following match cases use String.prototype.replaceAllMatches() function.

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

    Test:

    var str = "yash yas $dfdas.**";
    
    console.log('Index Matched replace : ', str.replaceMatch('as', '*', 2) );
    console.log('Index Matched replace : ', str.replaceMatch('y', '~', 1) );
    

    Output:

    Index Matched replace :  yash yas $dfd*.**
    Index Matched replace :  yash ~as $dfdas.**
    
  • 20楼
  • The methods on here are complicated. I would do it this way:

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

    This is as simple as it gets.

相关阅读:

Remove duplicates from an array of objects in JavaScript

Can I call jquery click() to follow an <a> link if I haven't bound an event handler to it with bind or click already?

Check whether a string matches a regex in JS

jQuery event to trigger action when a div is made visible

Check if user is using IE with jQuery

Resize HTML5 canvas to fit window

How to convert string to char array in C++?

How do I replace a character at a particular index in JavaScript?

How do I replace a character at a particular index in JavaScript?

How do I replace a character at a particular index in JavaScript?