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?
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);
I always like using split()
and join()
var string = "assassination";
var newString = string.split("a").join("o");
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');
}
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.