65

Imagine you were given a string and you had to sort that string alphabetically using a function. Example:

sortAlphabets( 'drpoklj' ); //=> returns 'djklopr' 

What would be the best way to do this?

1
  • 5
    I tried myself, but I couldn't find what I was looking for. This answer just adds to my experience. Commented Jun 18, 2015 at 10:26

3 Answers 3

119

You can use array sort function:

var sortAlphabets = function(text) { return text.split('').sort().join(''); }; 

STEPS

  1. Convert string to array
  2. Sort array
  3. Convert back array to string

Demo

Sign up to request clarification or add additional context in comments.

3 Comments

What's the space and time complexity of this solution?
@kdizzle Each of these methods is O(N) on its own...
Time Complexity: sort is O(N logN), split and join is O(N), so time complexity is O(N logN). Space Complexity is O(N).
38

Newer browsers support String.prototype.localeCompare() which makes sorting utf8 encoded strings really simple. Note that different languages may have a different order of characters. More information on MDN about localCompare.

function sortAlphabet(str) { return [...str].sort((a, b) => a.localeCompare(b)).join(""); } console.log(sortAlphabet("drpoklj")); // Logs: "djklopr"

If you only have to support ascii strings then the default sorting implementation will do.

function sortAlphabet(str) { return [...str].sort().join(""); } 

2 Comments

Note that the returned value is an array while it should be a string, so need to add .join("")
@yl2015 Good catch! I've updated the answer accordingly
21

As previous answers have shown, you convert the string to an array of single-character strings, sort that, and then recombine it into a string. But, using split isn't the best practice way to do that first step, because a JavaScript string is a series of UTF-16 code units with invalid surrogate pairs tolerated, and split("") splits up surrogate pairs into their individual code units, potentially separating them, thus breaking the code point (loosely: character) they're supposed to form as a pair. So if you have an emoji in the string (for instance) or any of hundreds of thousands of characters in non-Western scripts, those can get broken.

In ES5 and earlier, correctly splitting the string required that you detect and handle surrogate pairs to ensure they stayed together, which was a bit of a pain and involved checking charCodeAt for specific ranges of values.

As of ES2015+, it's really easy: You just use the string's iterator, which is defined to provide each code point in the string, whether that's a single code unit or two. To get an array of the code points, you can use the iterator via spread notation ([...str]) or Array.from (Array.from(str)).

So using that, we get:

function sortAlphabets(str) { return [...str].sort((a, b) => a.localeCompare(b)).join(""); } 

Live Example:

// Using the iterator function sortAlphabets(str) { return [...str].sort((a, b) => a.localeCompare(b)).join(""); } // Using split("") function sortAlphabetsUsingSplit(str) { return str.split("").sort((a, b) => a.localeCompare(b)).join(""); } const str = "😀देवनागरी😃"; console.log("Original string : " + str); console.log("Using the iterator : " + sortAlphabets(str)); console.log("Using split('') : " + sortAlphabetsUsingSplit(str));

Note how using split, some of the characters have gotten mangled.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.