Akulko
Akulko

Reputation: 133

Swap Case on javascript

I made a script that changes the case, but result from using it on text is exactly the same text, without a single change. Can someone explain this?

var swapCase = function(letters){
    for(var i = 0; i<letters.length; i++){
        if(letters[i] === letters[i].toLowerCase()){
            letters[i] = letters[i].toUpperCase();
        }else {
            letters[i] = letters[i].toLowerCase();
        }
    }
   console.log(letters);
}

var text = 'So, today we have REALLY good day';

swapCase(text);

Upvotes: 13

Views: 18596

Answers (11)

Elias Glyptis
Elias Glyptis

Reputation: 530

const swapCase = (myString) => {
  let newString = ''; // Create new empty string
  if (myString.match(/[a-zA-Z]/)) { // ensure the parameter actually has letters, using match() method and passing regular expression.
    for (let x of myString) {
      x == x.toLowerCase() ? x = x.toUpperCase() : x = x.toLowerCase();
      newString += x; // add on each conversion to the new string
    }
  } else {
    return 'String is empty, or there are no letters to swap.' // In case parameter contains no letters
  }
  return newString; // output new string
}

// Test the function.
console.log(swapCase('Work Today Was Fun')); // Output: wORK tODAY wAS fUN

console.log(swapCase('87837874---ABCxyz')); // Output: 87837874---abcXYZ

console.log(swapCase('')); // Output: String is empty, or there are no letters to swap.

console.log(swapCase('12345')); // Output: String is empty, or there are no letters to swap.

// This one will fail. But, you can wrap it with if(typeof myString != 'number') to prevent match() method from running and prevent errors.
// console.log(swapCase(12345));

Upvotes: 1

Mohamad
Mohamad

Reputation: 608

A new solution using map

let swappingCases = "So, today we have REALLY good day";

let swapping = swappingCases.split("").map(function(ele){

  return ele === ele.toUpperCase()? ele.toLowerCase() : ele.toUpperCase();
  
}).join("");

console.log(swapping);

Upvotes: 0

Vikas Garg
Vikas Garg

Reputation: 44

  1. Split the string and use the map function to swap the case of letters.
  2. We'll get the array from #1.
  3. Join the array using join function.

`

let str = 'The Quick Brown Fox Jump Over A Crazy Dog'
let swapedStrArray = str.split('').map(a => {
    return a === a.toUpperCase() ? a.toLowerCase() : a.toUpperCase()
})

//join the swapedStrArray
swapedStrArray.join('')
console.log('swapedStrArray', swapedStrArray.join(''))

`

Upvotes: 0

Le Markov
Le Markov

Reputation: 51

One liner for short mode code wars:

let str = "hELLO wORLD"
str.split("").map(l=>l==l.toLowerCase()?l.toUpperCase():l.toLowerCase()).join("")

Upvotes: 1

Abhijeet Prajapat
Abhijeet Prajapat

Reputation: 1

#this is a program to convert uppercase to lowercase and vise versa and returns the string.

function main(input) {
    var i=0;
    var string ='';
    var arr= [];
    while(i<input.length){
       string = input.charAt(i);

       if(string == string.toUpperCase()){
           string = string.toLowerCase();
           arr += string;
        }else {
           string = string.toUpperCase(); 
           arr += string;
       }
       i++;
    }
    console.log(arr);
}

Upvotes: 0

Sergej Popov
Sergej Popov

Reputation: 3021

Here is an alternative approach that uses bitwise XOR operator ^.
I feel this is more elegant than using toUppserCase/ toLowerCase methods

"So, today we have REALLY good day"
.split("")
.map((x) => /[A-z]/.test(x) ? String.fromCharCode(x.charCodeAt(0)  ^ 32) : x)
.join("")

Explanation
So we first split array and then use map function to perform mutations on each char, we then join the array back together.
Inside the map function a RegEx tests if the value is an alphabet character: /[A-z]/.test(x) if it is then we use XOR operator ^ to shift bits. This is what inverts the casing of character. charCodeAt convert char to UTF-16 code. XOR (^) operator flips the char. String.fromCharCode converts code back to char. If RegEx gives false (not an ABC char) then the ternary operator will return character as is.

References:

Upvotes: 1

Timur  Gilauri
Timur Gilauri

Reputation: 914

guys! Get a little simplier code:

string.replace(/\w{1}/g, function(val){
    return val === val.toLowerCase() ? val.toUpperCase() : val.toLowerCase();
});

Upvotes: 4

Pranesh Ravi
Pranesh Ravi

Reputation: 19113

You can use this simple solution.

var text = 'So, today we have REALLY good day';

var ans = text.split('').map(function(c){
  return c === c.toUpperCase()
  ? c.toLowerCase()
  : c.toUpperCase()
}).join('')

console.log(ans)

Using ES6

var text = 'So, today we have REALLY good day';

var ans = text.split('')
.map((c) =>
 c === c.toUpperCase() 
 ? c.toLowerCase()
 : c.toUpperCase()
).join('')

console.log(ans)

Upvotes: 13

Bradley Bossard
Bradley Bossard

Reputation: 2519

This is a solution that uses regular expressions. It matches each word-char globally, and then performs a function on that matched group.

function swapCase(letters) {
  return letters.replace( /\w/g, function(c) {
    if (c === c.toLowerCase()) {
      return c.toUpperCase();
    } else {
      return c.toLowerCase();
    }
  });
}

Upvotes: 0

Arnauld
Arnauld

Reputation: 6130

As a side note in addition to what has already been said, your original code could work with just some minor modifications: convert the string to an array of 1-character substrings (using split), process this array and convert it back to a string when you're done (using join).

NB: the idea here is to highlight the difference between accessing a character in a string (which can't be modified) and processing an array of substrings (which can be modified). Performance-wise, Fabricator's solution is probably better.

var swapCase = function(str){
    var letters = str.split("");

    for(var i = 0; i<letters.length; i++){
        if(letters[i] === letters[i].toLowerCase()){
            letters[i] = letters[i].toUpperCase();
        }else {
            letters[i] = letters[i].toLowerCase();
        }
    }
    str = letters.join("");
    console.log(str);
}

var text = 'So, today we have REALLY good day';

swapCase(text);

Upvotes: -1

Fabricator
Fabricator

Reputation: 12782

Like Ian said, you need to build a new string.

var swapCase = function(letters){
    var newLetters = "";
    for(var i = 0; i<letters.length; i++){
        if(letters[i] === letters[i].toLowerCase()){
            newLetters += letters[i].toUpperCase();
        }else {
            newLetters += letters[i].toLowerCase();
        }
    }
    console.log(newLetters);
    return newLetters;
}

var text = 'So, today we have REALLY good day';

var swappedText = swapCase(text); // "sO, TODAY WE HAVE really GOOD DAY"

Upvotes: 14

Related Questions