对as3数组进行group分组操作

来源:互联网 发布:程序员笔记本推荐 知乎 编辑:程序博客网 时间:2024/06/05 23:50
public static function getKeyValue(o:*,itemName:String):String
  {
   var keyValue:String=""
   var groupByArr:Array=itemName.split("_")
   for each(var col:String in groupByArr)
   {
    //a2.push(o[groupByArr[]])
    if(keyValue=="")
     keyValue=o[col]
    else
     keyValue+="_"+o[col]
   }
   return keyValue
  }
  /**
   *对数组进行sql分组操作
   * @param a1
   * @param itemName 分组字段 字段之间用_分隔
   * @param ref 要求出的聚合字段用_分隔,前面为字段名,后面为聚合类型,例如"score_sum","score_min","score_max","price_max"
   * @return
   * var o1:Object={nn:"eee",num:32,score:100,price:90}
    var o2:Object={nn:"eee1",num:321,score:60,price:60}
    var o3:Object={nn:"eee1",num:322,score:70,price:70}
    var o4:Object={nn:"eee2",num:322,score:80,price:120}
    var o5:Object={nn:"eee2",num:322,score:80,price:120}
    var c:Array=[]
    c.push(o1);
    c.push(o2);
    c.push(o3);
    c.push(o4);
    c.push(o5);
    var a:Array=groupbyArray(c,"num_nn","score_sum","score_min","score_max","price_max")
    for(var i:int=0;i<a.length;i++)
    {
     var key:String=a[i].key
     trace(key+"_________"+a[i].sum[i]["score"]+"_"+a[i].max[i]["score"]+"_"+a[i].min[i]["score"]+"_"+a[i].max[i]["price"]+"_"+a[i].len)
    }
   */  
  public static function groupbyArray(a1:Array,itemName:String,...ref):Array
  {
   var a2:Array=[]
   var result:Array=[]
   for each(var o:Object in a1)//求出group by键
   {
    a2.push(getKeyValue(o,itemName));
   }
   var newArray:Array = [];
   for(var i:int = 0; i < a2.length; i++)
   {
    if (newArray.indexOf(a2[i]) == -1)
     newArray.push(a2[i]);
   }
   trace(newArray);
   var len:int=ref.length
   var keyArr:Array=[]
   for(var j:int=0;j<len;j++)
   {
    var c:Array=ref[j].toString().split("_")
    keyArr[j]={key:c[0],type:c[1]}
   }
   var maxNum:Array=[]
   var minNum:Array=[]
   var sumNum:Array=[]
   var averageNum:Array=[]
   var groupLen:Array=[]
   for(var k:int=0;k<newArray.length;k++)
   {
    var item:String=newArray[k].toString()
    groupLen[item]=0
    for each(var o2:Object in a1)
    {
     if(item==getKeyValue(o2,itemName))//o2[itemName])
     {
      groupLen[item]+=1
      for each(var d:Object in keyArr)
      {
       if(d.type=="max")
       {
        if(!maxNum[k])
         maxNum[k]=[]
        if(!maxNum[k][d.key] || maxNum[k][d.key]<o2[d.key])
         maxNum[k][d.key]=o2[d.key]
       }
       else if(d.type=="min")
       {
        if(!minNum[k])
         minNum[k]=[]
        if(!minNum[k][d.key] || minNum[k][d.key]>o2[d.key])
         minNum[k][d.key]=o2[d.key]
       }
       else if(d.type=="sum")
       {
        if(!sumNum[k])
         sumNum[k]=[]
        if(!sumNum[k][d.key])
         sumNum[k][d.key]=0
        sumNum[k][d.key]+=o2[d.key]
       }
      }
     }
    }
    result[k]={max:maxNum,min:minNum,sum:sumNum,aver:averageNum,key:item,len:groupLen[item]}
   }
   return result;
  }
原创粉丝点击