Array.sortOn( ) Method | Flash 6 |
sort an array of objects by the specified property |
A mandatory string specifying which property should be used to sort the objects in array.
The sortOn( ) method is used to sort an array of objects according to the value of a specified property. The elements of array are expected to be objects. Each object is expected to have a property, specified by the string key, that will be used to sort the object. If key is not provided, sortOn( ) silently fails and no sort is performed.
The following code populates a three-element array with object literals that define fruit and meat properties:
var shoppingList = new Array(); shoppingList[0] = {fruit:"mango", meat:"beef"}; shoppingList[1] = {fruit:"orange", meat:"pork"}; shoppingList[2] = {fruit:"apple", meat:"chicken"};
To sort the shoppingList array by the fruit property, we use:
shoppingList.sortOn("fruit"); // shoppingList now contains: // ELEMENT 0: {fruit:"apple", meat:"chicken"} // ELEMENT 1: {fruit:"mango", meat:"beef"} // ELEMENT 2: {fruit:"orange", meat:"pork"};
More typically, the objects in the array will be instances of some class. For example:
// Create a simple Contact class with firstName and lastName properties function Contact (firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } // Override toString( ) for our class so it returns a more legible value Contact.prototype.toString = function () { return this.firstName + " " + this.lastName; } // Populate a contacts array with Contact instances var contacts = new Array(); contacts[0] = new Contact("Colin", "Moock"); contacts[1] = new Contact("Bruce", "Epstein"); contacts[2] = new Contact("Derek", "Clayton"); // Sort by lastName... contacts.sortOn("lastName"); trace(contacts); // Displays: Derek Clayton,Bruce Epstein,Colin Moock // Sort by firstName... contacts.sortOn("firstName"); trace(contacts); // Displays: Bruce Epstein,Colin Moock,Derek Clayton
Note that sortOn( ) uses the standard compare function to sort values (as if sort( ) had been called with no arguments). The sortOn( ) method does not offer any custom compare function capabilities. For sorting routines that require a custom compare function, use the sort( ) method instead. To ensure case-insensitive alphabetic sorting for Latin 1 letters, use String.toUpperCase( ) to convert property values to uppercase before calling sortOn( ).
When an element does not contain an object with a key property, that element is converted to a string and then ordered according to the default sort rules.
In Flash Player 6, using sortOn( ) on an array that contains both strings and objects can crash the Player and the browser in which it is running. For example, the following code crashes Flash Player 6:
var shoppingList = new Array(); shoppingList[0] = {fruit:"mango", meat:"beef"}; shoppingList[1] = "hi"; shoppingList[2] = {fruit:"apple", meat:"chicken"}; shoppingList.sortOn("fruit");
Therefore, it is advisable to user a wrapper function that first checks whether all elements are objects before calling sortOn( ), such as:
Array.prototype.safeSortOn = function (key) { for (i=0; i < this.length; i++) { if (typeof this[i] != "object") { trace ("Element " + i + " is not an object."); return; } } // If it passes the test, then call sortOn() this.sortOn(key); } // Usage: // This won't crash Flash Player 6. shoppingList.safeSortOn("fruit");
The sort order is indeterminate when multiple elements have the identical value for the key property. In this case, sortOn( ) may produce inconsistent results between multiple calls. For example:
function Contact (firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } Contact.prototype.toString = function () { return this.firstName + " " + this.lastName; } // Populate a contacts array with Contact instances that // share identical lastName property values. var contacts = new Array(); contacts[0] = new Contact("Makiko", "Pitaru"); contacts[1] = new Contact("Amit", "Pitaru"); contacts[2] = new Contact("Richard", "Clayton"); contacts[3] = new Contact("Derek", "Clayton"); // Sort by lastName... contacts.sortOn("lastName"); trace(contacts); // Displays: // Richard Clayton,Derek Clayton,Makiko Pitaru,Amit Pitaru // Sort AGAIN by lastName... contacts.sortOn("lastName"); trace(contacts); // Displays DIFFERENT RESULTS: // Richard Clayton,Derek Clayton,Amit Pitaru,Makiko Pitaru