5
\$\begingroup\$

I've solved the problem below just would like some feedback?

The function LetterChanges(str) takes a str parameter

Replace every letter in the string with the letter following it in the alphabet (ie. c becomes d, z becomes a). Then capitalize every vowel in this new string (a, e, i, o, u) and finally return this modified string.

function LetterChanges(str) { 
 var newString = '';
 var newCode = 0;
 var len = str.length;
 var i = 0;
 for (; i < len; i++){
 /*Using ASCII code: this if statement return true if character at
 str[i] is a - y*/
 if (str.charCodeAt(i) >= 97 && str.charCodeAt(i) <= 121) {
 //Assign ASCII code plus 1 to a variable newCode
 newCode = str.charCodeAt(i) + 1;
 /*Check to see newCode variable is a lower case vowel from ASCII 
 and if so, add capital of that vowel to newString variable, else
 use newCode variable to add character to newString*/
 if (newCode == 101) {
 newString += String.fromCharCode(69);
 } else if (newCode == 105) {
 newString += String.fromCharCode(73);
 } else if (newCode == 111) {
 newString += String.fromCharCode(79);
 } else if (newCode == 117) {
 newString += String.fromCharCode(85);
 } else {
 newString += String.fromCharCode(newCode);
 }
 /*Using ASCII code: this if statement return true if character at
 str[i] is z, in that case adding capital A*/
 } else if (str.charCodeAt(i) == 122){
 newString += String.fromCharCode(65);
 /*else just add to newString i.e uppercase(question didn't specify), 
 symbols, number...*/ 
 } else {
 newString += str[i];
 }
 }
return newString; 
}
200_success
145k22 gold badges190 silver badges478 bronze badges
asked Jun 16, 2017 at 18:11
\$\endgroup\$
1
  • 1
    \$\begingroup\$ Short and readable: function transform(str) {const replacements = 'bcdEfghIjklmnOpqrstUvwxyzA'; return str.replace(/[a-z]/g, char => replacements[char.charCodeAt(0) - 97]);} \$\endgroup\$ Commented Jun 18, 2017 at 14:47

3 Answers 3

7
\$\begingroup\$

DRY (Don't Repeat Yourself)

You have a list of else if statements that all do the same thing. JavaScript has the .toUpperCase method so hardcoding character codes to perform capitalization is unnecessary. You can do newString += str[i].toUpperCase().

Use variables for constant values

Instead of constant values directly in your code, use a variable to store them. You know you want to capitalize vowels, so you can create an array var vowels = ['a', 'e', 'i', 'o', 'u'] to store your constants. This makes it easier to modify in the future - like if the requirements changed and now y is a vowel.

Putting these two together, your capitalization code can be pretty concise:

// vowels.indexOf(str[i]) !== -1 would work, too
if(vowels.includes(str[i]){ 
 newString += str[i].toUpperCase();
}
answered Jun 16, 2017 at 19:59
\$\endgroup\$
1
\$\begingroup\$

@Zanchi, Thanks for the response, I'm new to coding so really do appreciate the feedback, code looks much more concise!!

New code

function LetterChanges(str) { 
var newString = '';
var vowels = ['a','e','i','o','u']
var newCode = 0;
var len = str.length;
var i = 0;
var z = 'z';
var a = 'A';
for (; i < len; i++){
 /*Using ASCII code: this if statement return true if character at
 str[i] is a - y*/
 if (str.charCodeAt(i) >= 97 && str.charCodeAt(i) <= 121) {
 //Assign ASCII code plus 1 to a variable newCode
 //return newLetter
 newCode = str.charCodeAt(i) + 1;
 newLetter = String.fromCharCode(newCode);
 /*Loop newLetter through vowel list, add letter to newString if 
 found, else add upperCase newLetter*/
 if (vowels.includes(newLetter)) {
 newString += newLetter.toUpperCase();
 } else {
 newString += newLetter;
 }
 /*Use variables: Check to see if letter is z in which case add 'A' */
 } else if (str[i] === z){
 newString += a;
 /*else just add to newString i.e uppercase(question didn't specify), 
 symbols, number...*/ 
 } else {
 newString += str[i];
 }
}
return newString; 
} 
answered Jun 17, 2017 at 6:15
\$\endgroup\$
-1
\$\begingroup\$

I would use a hash table to keep things simpler

const LetterChanges = (str) => {
 const letters = {
 a: 'b', b: 'c', c: 'd', d: 'E', e: 'f', f: 'g', g: 'h', h: 'I', i: 'j', j: 'k', k: 'l', l: 'm', m: 'n', n: 'O', o: 'p', p: 'q', q: 'r', r: 's', s: 't', t: 'U', u: 'v', v: 'w', w: 'x', x: 'y', y: 'z', z: 'A',
 };
 return str.split('').reduce((acc, curr) => {
 return acc + letters[curr];
 }, '');
};
answered May 5, 2022 at 16:19
\$\endgroup\$
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.