DEV Community

David Clark
David Clark

Posted on

How does this alphabetical-sorting function work?

I'm pretty sure I wrote this function based off of someone else's that I saw. Trouble is, I'm looking back through some code, and I don't fully understand how it works.

What I have is a Set that I'm sorting alphabetically. That Set is named, aptly, uniqueSet. Here's the code:

let sortedList = uniqueSet
  .sort((a, b) => {
    if (a < b) return -1;
    else if (a > b) return 1;
    return 0;
  })

Top comments (2)

Collapse
 
curtisfenner profile image
Curtis Fenner

.sort is a function in JavaScript. It modifies the list in place, so uniqueSet is also affected by this, not just sortedList. (It just also returns the same list, as a convenience for chaining multiple calls on the array)

You give it a comparison function. The comparison function should behave something like "minus": if the left thing is 'smaller' (you want the left earlier in the list than the right), return a negative number. If the left and right are the same, return 0. If the left is 'bigger', return a positive number.

Your function does this by comparing a and b.

Note that the default is to sort strings in this way. If uniqueSet's elements are strings, you could instead write let sortedList = uniqueSet.sort().

However, for numbers, the default does the wrong thing, as it first converts the numbers to strings (resulting in the confusing "11" < "2"), and you need to write the code that you have here.

Collapse
 
daviddoes profile image
David Clark • Edited

Yes, yes, yes! It's all coming back now.

Follow-up:

Here is the rest of what I'm doing with this data:

    let momentsList = [];
    this.props.moments.forEach(({ id, location }) => momentsList.push({ id, location }));
    let uniqueSet = [...new Set(momentsList.map(moment => moment.location))];

The data being returned, stored in momentsList, and manipulated, is an array of objects (as you can see). Using let sortedList = uniqueSet.sort() worked for it. I think because I'm getting the id and location, then mapping the location.