Question

I have an arrayCollection which I created dynamically like one at bottom:

arrCol = ({"ID":ids[i][0], "Price":ids[i][1], "OtherInfo":ids[i][2]});

I want to group data and summarise Price by ID.

If this ArrayCollection was a SQL table, I could use a query like this:

SELECT ID, SUM(Price), OtherInfo 
FROM TableA 
GROUP BY ID

So how can I set an AS3 function like the query example in SQL or is there any native ArrayCollection class for this?

Was it helpful?

Solution

Try this, there is no built in function available for your need(sum,groupby) so we need to do manually below code will help you.

var arrCol:ArrayCollection = new ArrayCollection();

arrCol.addItem({"ID":1, "Price":100, "OtherInfo":"info"});
arrCol.addItem({"ID":1, "Price":700, "OtherInfo":"info"});
arrCol.addItem({"ID":2, "Price":100, "OtherInfo":"info"});
arrCol.addItem({"ID":2, "Price":200, "OtherInfo":"info"});
arrCol.addItem({"ID":3, "Price":100, "OtherInfo":"info"});
arrCol.addItem({"ID":3, "Price":400, "OtherInfo":"info"});
arrCol.addItem({"ID":3, "Price":100, "OtherInfo":"info"});

var dic:Dictionary = new Dictionary();

for each (var item:Object in arrCol) 
{
    if(!dic[item.ID]){
        dic[item.ID] = item;
    }
    else{                        
        var oldSumObj:Object = dic[item.ID];
        oldSumObj.Price +=item.Price;
        dic[item.ID] = oldSumObj;
    }
}

var groupedList:ArrayCollection = new ArrayCollection();

for each (var itemObj:Object in dic) 
{
    groupedList.addItem(itemObj);
}   

output will be:

"groupedList"   mx.collections.ArrayCollection (@27af939)   
    [0] Object (@8836569)   
        ID  1   
        OtherInfo   "info"  
        Price   800 [0x320] 
    [1] Object (@87a7c71)   
        ID  2   
        OtherInfo   "info"  
        Price   300 [0x12c] 
    [2] Object (@87a7bc9)   
        ID  3   
        OtherInfo   "info"  
        Price   600 [0x258] 

OTHER TIPS

While you can't make SQL type queries in AS3, you can use its bevy of methods to achieve the same result.

// Work with an array.  Child elements must be an associative array (structure/object/hash-table)
var ac:Array = [
    {"name":"apple", "price":100, "color":"red"},
    {"name":"banana", "price":50, "color":"yellow"},
    {"name":"pear", "price":250, "color":"green"},
]

// Apply the order your want based on the property you're concerned with.
ac.sortOn("price", Array.ASCENDING)

// If necessary, create a subset of that array with the "select"-ed columns.
var output:Array = [];
for each (var entry:Object in ac) {
    output.push({entry.name, entry.color});
}

// Printing output will result in
// 0:{"name":"banana", "color":"yellow"},
// 1:{"name":"apple", "color":"red"},
// 2:{"name":"pear", "color":"green"}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top