I completed the challenge and passed the tests:

Perform a search and replace on the sentence using the arguments provided and return the new sentence.

First argument is the sentence to perform the search and replace on.

Second argument is the word that you will be replacing (before).

Third argument is what you will be replacing the second argument with (after).

Note

Preserve the case of the first character in the original word when you are replacing it. For example if you mean to replace the word "Book" with the word "dog", it should be replaced as "Dog".

Example

myReplace("Let us go to the store", "store", "mall") should return "Let us go to the mall".

I was hoping to simplify my code more. Is there a more concise way to write this program that would end up being cleaner and faster than the current code?

function myReplace(str, before, after) {
  let newStr = str.split(' ');
  for (var a=0; a < str.length; a++) {
    if(before === newStr[a]) {
      str = str.replace(before, after);
    } 
    if (before[0] === before[0].toUpperCase()) {
      var swap = after[0].toUpperCase() + after.slice(1);
      str = str.replace(before, swap)
    }
  }
  return str;
}

console.log(myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped"));

  • How is "cleaner" defined and "faster" measured? – guest271314 Dec 1 at 0:56

This kind of test boils down the the familiarity of built-in JavaScript APIs. The naive way to go about this problem is to scan through the string and do the checks manually. However...

Pass a function as second argument of string.replace() and it will call that function for each match it encounters. The return value of this function becomes the replacement. So instead of manually scanning the string, you can let string.replace() do that heavy-lifting. Note that passing a string as first argument to replace only makes it run once, which is why the first argument is a RegExp with a g flag constructed from the string you want replaced.

Also, a minor suggestion. Instead of comparing the first letter with its upper case version to see if it is upper case, you can use regex.test() to see if a character matches a pattern that only matches uppercase. It's a bit shorter, if length is what you're after.

function myReplace(str, before, after) {
  return str.replace(new RegExp(before, 'g'), match => {
    return (/[A-Z]/).test(before[0]) ? `${after[0].toUpperCase()}${after.slice(1)}` : after
  })
}

console.log(myReplace("Let us go to the store", "store", "mall"))
console.log(myReplace("He is Sleeping on the couch", "Sleeping", "sitting"))
console.log(myReplace("This has a spellngi error", "spellngi", "spelling"))
console.log(myReplace("His name is Tom", "Tom", "john"))
console.log(myReplace("Let us get back to more Coding", "Coding", "algorithms"))
console.log(myReplace("foo foo foo foo bar foo", "foo", "baz"))

  • 2
    The regexp should be escaped and case-insensitive. Since the challenge specifies that before is a "word", it should also have \b assertions at the beginning and end. – 200_success Aug 2 at 21:22

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.