Как я могу создать SQL-подобную группу AS3 ArrayCollection

У меня есть arrayCollection, который я создал динамически, как внизу:

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

Я хочу сгруппировать данные и суммировать Price по идентификатору.

Если бы эта ArrayCollection была таблицей SQL, я мог бы использовать такой запрос:

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

Итак, как я могу установить функцию AS3, как пример запроса в SQL, или есть ли для этого собственный класс ArrayCollection?


person Sencer Alfonzo Gomestai    schedule 10.02.2014    source источник
comment
В классе AarrayCollection таких функций нет. Вам нужно будет перебрать массив и сохранить сумму в переменной.   -  person hidarikani    schedule 10.02.2014


Ответы (2)


Попробуйте это, нет встроенной функции, доступной для ваших нужд (сумма, группировка), поэтому нам нужно сделать это вручную, приведенный ниже код поможет вам.

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);
}   

вывод будет:

"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] 
person Raja Jaganathan    schedule 14.02.2014

Хотя вы не можете делать запросы типа SQL в AS3, вы можете использовать его набор методов для достижения того же результата.

// 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"}
person Atriace    schedule 11.02.2014