Replacing all instances of certain character in JS

2019-09-08 11:37发布

I am trying to create a simple function that replaces all instances of a certain character in a string in JS. In this instance, I want to replace all a's with o's.

I am pretty sure the code is right, but the output is still the original string.

function replaceLetter(string){
  for(var i = 0; i < string.length; i++){
    if(string[i] == 'a'){
      console.log(string[i]);
      string[i] = 'o'
    }
  }
  return string;
}

replaceLetter('hahaha') // returns 'hahaha'

Why isn't it replacing a's with o's?

4条回答
不美不萌又怎样
2楼-- · 2019-09-08 12:06

I always like using split() and join()

var string = "assassination";
var newString = string.split("a").join("o");
查看更多
Rolldiameter
3楼-- · 2019-09-08 12:12

Strings in Javascript are immutable, and thus any changes to them aren't going to be reflected as you might expect.

Consider just using the string.replace() function instead:

function replaceLetter(string){
  // This uses a regular expression to replace all 'a' characters with 'o'
  // characters (the /g flag indicates that all should be matched)
  return string.replace(/a/g,'o');
}
查看更多
Lonely孤独者°
4楼-- · 2019-09-08 12:29

You can use a regular expression like this:

function replaceLetter(str) {
    return str.replace(/a/g, 'o');
}

var st = replaceLetter('hahaha');

console.log(st);

Or use another string to accumulate the result like this:

function replaceLetter(str) {
    var res = '';                               // the accumulator (because string litterals are immutable). It should be initialized to empty string
  
    for(var i = 0; i < str.length; i++) {
        var c = str.charAt(i);                  // get the current character c at index i
        if(c == 'a') res += 'o';                // if the character is 'a' then replace it in res with 'o'
        else res += c;                          // otherwise (if it is not 'a') leave c as it is
    }

    return res;
}

var st = replaceLetter('hahaha');

console.log(st);

查看更多
老娘就宠你
5楼-- · 2019-09-08 12:29

Assuming you want to use a for loop:

function replaceLetter(string){
  var result = '';

  for (var i = 0; i < string.length; i++) {
    result += string[i] === 'a' ? 'o' : string[i];
  }
  return result;
}

You have to build a new string like this, because as mentioned in a comment, strings are immutable. You can write string[4] = 'b' and it won't cause an error, but it won't do anything either.

It's probably overkill, but you could use reduce, which does the looping internally and maintains the result variable:

const replaceLetter = string => 
  [...string].reduce((result, chr) => 
    result += (chr === 'a' ? 'o' : chr), '');

However, for this particular case, the regexp solution shown in other answers is probably preferable.

查看更多
登录 后发表回答