Home | Account | Search  
AS3/Flex - Find the minimum or maximum value for a specific node
While there are built in methods of sorting by a specific node in an XML file (using Sort, SortField, and the refresh function in ListCollectionView), it often fails to accomplish the task of sorting. I have found AS3's Array.sort and Array.sortOn to be more reliable when sorting numeric elements.

Given the following XML (save as test.xml):
<?xml version="1.0" encoding="utf-8?>
<rows>
    <row>
         <Department>DEPT 02</Department>
         <Element1>294</Element1>
          <Element2>244</Element2>
    </row>
    <row>
         <Department>DEPT 00</Department>
         <Element1>300</Element1>
          <Element2>851</Element2>
    </row>
    <row>
         <Department>DEPT 01</Department>
         <Element1>325</Element1>
          <Element2>465</Element2>
    </row>
    <row>
         <Department>DEPT 05</Department>
         <Element1>5464</Element1>
          <Element2>545</Element2>
    </row>
    <row>
         <Department>DEPT 04</Department>
         <Element1>348</Element1>
          <Element2>546</Element2>
    </row>
</rows>


Find the maximum or minimum value for the node "Element1" or "Element2". Here's one way to do it using the sort function.

private function findValue(xmlData:XMLList, nodeName:String, options:Object=null):String
{
    var coll:XMLListCollection = new XMLListCollection(xmlData.row[nodeName]);
    var tmp:Array = new Array();
   
    for(var i:int = 0; i < coll.children().length(); i++)
    {
        tmp.push(coll[i]);   
    }
   
    var sorted:Array = tmp.sort(options);
    return sorted[0];
}


Usage:
trace("MAX Element1: " + findValue(xml, "Element1", Array.DESCENDING|Array.NUMERIC));
trace("MAX Element2 " + findValue(xml, "Element2", Array.DESCENDING|Array.NUMERIC));
trace("MIN Element1: " + findValue(xml, "Element1", Array.NUMERIC));
trace("MIN Element2: " + findValue(xml, "Element2", Array.NUMERIC));


Output:
MAX SUBMITTED: 5464
MAX FILLED: 851
MIN SUBMITTED: 294
MIN FILLED: 244

Example MXML:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"    creationComplete="init()">
    <mx:Script>
        <![CDATA[

            import mx.collections.XMLListCollection;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import mx.rpc.http.HTTPService;
           
            private function init():void
            {
                // load xml
                var service:HTTPService = new HTTPService();
                service.resultFormat = HTTPService.RESULT_FORMAT_E4X;
                service.url = "test.xml";
                service.addEventListener(ResultEvent.RESULT, resultHandler);
                service.addEventListener(FaultEvent.FAULT, errHandler);
                service.send();   
            }
           
            private function resultHandler(evt:ResultEvent):void
            {
                var xml:XMLList = new XMLList(evt.result);
               
                trace("MAX Element1: " + findValue(xml, "Element1", Array.DESCENDING|Array.NUMERIC));
                trace("MAX Element2 " + findValue(xml, "Element2", Array.DESCENDING|Array.NUMERIC));
               
                trace("MIN Element1: " + findValue(xml, "Element1", Array.NUMERIC));
                trace("MIN Element2: " + findValue(xml, "Element2", Array.NUMERIC));
            }
           
            private function findValue(xmlData:XMLList, nodeName:String, options:Object=null):String
            {
                var coll:XMLListCollection = new XMLListCollection(xmlData.row[nodeName]);
                var tmp:Array = new Array();
               
                for(var i:int = 0; i < coll.children().length(); i++)
                {
                    tmp.push(coll[i]);   
                }
               
                var sorted:Array = tmp.sort(options);
                return sorted[0];
            }
           
            private function errHandler(evt:FaultEvent):void
            {
                trace(evt.fault.message);
            }
           
        ]]>
    </mx:Script>
</mx:Application>