Thursday, November 17, 2011

Interesting point about JavaScript array sorting

Hi All,
Would like to share one point on java script
array sorting, recently one of my team members had one issue during this we realized this one. So it made me to pen this article.

Sorting arrays in JavaScript is done via the method array.sort(). While calling sort() by itself simply sorts the array in alphabetical order.

For example :

//Sort alphabetically and ascending:
var myarray=["CC", "BB", "AA"]
myarray.sort() //Array now becomes ["AA", "BB", "CC"]

Notice that the order is ascending. To make it descending instead, the simplest way is to enlist the help of another Array method in combination, array.reverse():

//Sort alphabetically and descending:
var myarray=["CC", "AA", "BB"]
myarray.sort()
myarray.reverse() //Array now becomes ["CC", "BB", "AA"]

Now, before you start feeling comfortable, consider what happens if we call array.sort() on an array consisting of numbers: ????


var myarray=[7, 40, 300]
myarray.sort() //Array now becomes [300,40,7]

Although 7 is numerically smaller than 40 or 300, lexicographically, it is larger, so 7 appears at the very right of the sorted array. Remember, by default array.sort() sorts its elements in lexicographical order.

And there you have it with array.sort() in terms of its basic usage. But there's a lot more to this method than meets the eye. Array.sort() accepts an optional parameter in the form of a function reference that pretty much lets you sort an array based on any custom criteria, such as sort an array numerically or shuffle it (randomize the order of its elements).
Passing in a function reference into array.sort()
As touched on already, array.sort() accepts an optional parameter in the form of a function reference (lets call it sortfunction). The format of this function looks like this:

array.sort(sortfunction)

function sortfunction(a, b){
//Compare "a" and "b" in some fashion, and return -1, 0, or 1
}

When such a function is passed into array.sort(), the array elements are sorted based on the relationship between each pair of elements "a" and "b" and the function's return value. The three possible return numbers are: <0 (less than 0), 0, or >0 (greater than 0):

    Less than 0: Sort "a" to be a lower index than "b"
     Zero: "a" and "b" should be considered equal, and no sorting performed.
     Greater than 0: Sort "b" to be a lower index than "a".

To sort an array numerically and ascending for example, the body of your function would look like this:

function sortfunction(a, b){
return (a - b) //causes an array to be sorted numerically and ascending
}

More on this below.
Sorting an array in numerical order

To sort an array in numerical order, simply pass a custom sortfunction into array.sort() that returns the difference between "a" and "b", the two parameters indirectly/ automatically fed into the function:

//Sort numerically and ascending:
var myarray=[25, 8, 7, 41]
myarray.sort(function(a,b){return a - b}) //Array now becomes [7, 8, 25, 41]

This works the way it does because whenever "a" is less than "b", a negative value is returned, which results in the smaller elements always appearing to the left of the larger ones, in other words, ascending.

Sort an array numerically but descending isn't much different, and just requires reversing the two operands "a" and "b":

//Sort numerically and descending:
var myarray=[25, 8, 7, 41]
myarray.sort(function(a,b){return b - a}) //Array now becomes [41, 25, 8, 71]

Thats it.

Hope it will useful to many.

Note: Content is refereed from javascriptkit site.

 

Thanks,
Ravi




No comments:

Post a Comment