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

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

分类 : 互动问答 | 发布时间 : 2009-09-16 13:21:22 | 评论 : 20 | 浏览 : 412464 | 喜欢 : 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.

相关阅读:

How to move an element into another element?

Set HTTP header for one request

How to split one string into multiple strings separated by at least one space in bash shell?

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++?