In each word from string, every even indexed chars in each word should be upper cased.
Example: “This is a sample” -> “ThIs Is A SaMpLe”
I know that it’s not the best solution to solve this problem but I want to understand why the last assignment doesn’t work.
function toWeirdCase(string) {
const arr = string.toLowerCase().split(' ')
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr[i].length; j += 2) {
let temp = arr[i][j] // temp = t, i, i
temp = temp.toUpperCase() // temp = T, I, I
arr[i][j] = temp // arr[i][j] = t, i, i but why not T, I, I
}
}
return arr.join(' ')
}
console.log(toWeirdCase('This is'))
Advertisement
Answer
arr is an array of strings, therefore arr[i] is a string and arr[i][j] = temp attempts to change a character in a string but in JavaScript the strings are immutable.
It is explained in the JavaScript documentation of strings:
When using bracket notation for character access, attempting to delete or assign a value to these properties will not succeed. The properties involved are neither writable nor configurable.
In order to solve your assignment you can build the scrambled value into a new string (let’s name it mixed, by appending one character at a time (mixed = mixed + temp.toUpperCase()) then, in the outer for put mixed back in arr[i]:
const arr = str.toLowerCase().split(' ')
for (let i = 0; i < arr.length; i++) {
let mixed = '';
for (let j = 0; j < arr[i].length; j++) {
let temp = arr[i][j]
// Turn to uppercase the characters on even positions
if (j % 2 === 0) {
temp = temp.toUpperCase()
}
mixed = mixed + temp
}
// Put the processed word back into the array
arr[i] = mixed
}