Dylan Cross
Dylan Cross

Reputation: 5986

Sort JavaScript array with mixed characters

I am trying to sort an array of names into least to greatest order. Unfortunately JavaScript's .sort() will not work because it has underscores and letters in it.

I have this code:

var array = new Array("S1_FORM", "S2_FORM", "S3_2_FORM", "S3_FORM", "S3_3_FORM", "S4_FORM");
var SortedArray = array.sort();

This should sort it to be like:

S1_FORM, S2_FORM, S3_FORM, S3_2_FORM, S3_3_FORM, S4_FORM

Here's a jsdfiddle:

Upvotes: 0

Views: 481

Answers (3)

Thriggle
Thriggle

Reputation: 7049

As SHIELDHEAD suggested, you can pass a custom comparator function into Array.sort() when you want to sort by different rules than the default alphabetical/ordinal rules.

The format of the comparator function is as follows:

function(a,b){
     // if a should be before b, return -1
     // if b should be before a, return 1
     // if they are equal, return 0
     return a < b ? -1 : a > b ? 1 : 0;
}

In your case, I believe what your comparator function will need to do is grab the substring between "S" and "F" in your strings and compare those.

You can get that substring using regex: a = a.match(/(?!S)([0123456789_])+(?!F)/g);

Here's the working code:

var array = new Array("S1_FORM", "S2_FORM", "S3_2_FORM", "S3_FORM", "S3_3_FORM", "S4_FORM");
array.sort(function(a,b){
	a = a.match(/(?!S)([0123456789_])+(?!F)/g);
	b = b.match(/(?!S)([0123456789_])+(?!F)/g);
	return a < b ? -1 : a === b ? 0 : 1;
});
document.getElementById("output").innerHTML = JSON.stringify(array);
<div id="output"/>

EDIT: Also note that the sort() function changes the original array, so you don't need to create a separate variable to store the sorted array.

Upvotes: 0

Shannon Poole
Shannon Poole

Reputation: 866

Your sort is a bit tricky since the _FORM keeps it from being just a straightforward lexicographical sort.

Try this:

var SortedArray = array.sort(function(a, b){
                    a = a.slice(0, -5);
                    b = b.slice(0, -5); 
                    return a < b ? -1 : (a > b) ? 1 : 0;
                  });

Upvotes: 2

SHIELDHEAD
SHIELDHEAD

Reputation: 45

I believe you want a custom sort comparison function. See this post: How to define custom sort function in javascript?

Upvotes: 1

Related Questions