PDA

View Full Version : sortOn when an array contains objects?



Stickeroo
September 4th, 2008, 02:37 PM
I have an array made up of generic objects; all of the objects have the same properties, one of which is a textfield (named, creatively enough, "textfield").

What I need to be able to do is sort the array based on the text property of the textfield property, something like this:



listArray.sortOn("textfield.text", Arrray.CASEINSENSITIVE)


which doesn't work. Can anyone suggest a functional way to do this? Thanks!

wvxvw
September 4th, 2008, 03:27 PM
var fooText:String = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvXxYyZz";
function foo():Object
{
return { i:Math.random(),
str:randomString(),
toString:function():String
{
return "[Obj " + this.i + " | " + this.str + "]";
} };
}
function randomString():String
{
var s:String = "";
var i:int = Math.random() * 100;
while (--i) s += fooText.charAt((Math.random() * fooText.length) << 0);
return s;
}
var i:int = 10;
var arr:Array = [];
while (--i) arr.push(foo());

function sortOnI(objA:Object, objB:Object):int
{
if (objA.i > objB.i) return 1;
if (objA.i == objB.i) return 0;
return -1;
}
function sortOnSTR(objA:Object, objB:Object):int
{
var a:String = objA.str.toLowerCase();
var b:String = objB.str.toLowerCase();
var i:int = Math.min(a.length, b.length);
var l:int = 0;
while(l < i)
{
if (a.charCodeAt(l) > b.charCodeAt(l)) return 1;
if (a.charCodeAt(l) < b.charCodeAt(l)) return -1;
l++;
}
if (a.length > b.length) return 1;
if (a.length == b.length) return 0;
return -1;
}
arr.sort(sortOnI);
trace("********* sortOnI *********");
trace(arr.join("\r"));
trace("********* sortOnSTR *********");
arr.sort(sortOnSTR);
trace(arr.join("\r"));
You'd need Array.sort() rather than Array.sortOn().