繁体   English   中英

按月份的Java分组

[英]Javascript grouping by day of month

我有以下API调用返回的JSON对象

Object {Result: Array[5]}
Result: Array[5]
0: Object
  id: 1
  name: "Mark"
  joinDate: 2014-05-03T22:12:05.000Z
  balance: 2201
1: Object
2: Object
3: Object
4: Object
5: Object
length: 5
__proto__: Array[0]
__proto__: Object

我需要在此处对数据进行分组,并在一个月的每一天产生一个新的对象分组,将客户及其余额进行分组。 这样我最终得到了一个对象(假设我基于上述对象为May生产了一个对象):

{
   0:Object
    id: 1 >> Referring to Day 1 of the month
    nof_of_clients: 5
    total_balance: 30,899
   1:Object
    id: 2 >> Referring to Day 2 of the month
    nof_of_clients: 12
    total_balance: 20000
   2:Object
    id: 5 >> Referring to Day 5 of the month
    nof_of_clients: 2
    total_balance: 1200
}

所以我想知道是否可以通过Javascript来做到这一点,如果可以,怎么办? 任何示例将不胜感激。 谢谢

好吧,您将需要遍历结果并生成一个对象,该对象可以根据需要对数据进行分组。 首先,您需要计算每个结果的日期,月份和年份:

for(var i=0;i<result.length;i++){
    result[i].day=result[i].joinDate.split('T')[0];
    var arr=result[i].day.split('-');
    result[i].day_of_month=Number(arr[2]);
    result[i].month=Number(arr[1]);
    result[i].year=Number(arr[0]);
}

然后,您需要遍历结果并生成按年,月,日分组的对象:

var arr={};
for(var i=0;i<result.length;i++){
    current=result[i];
    if(!arr.hasOwnProperty(current.year)){//if year doesnt exist, create year
       arr[current.year]={};   
    }
    if(!arr[current.year].hasOwnProperty(current.month)){// if month doesnt exist, create month
        arr[current.year][current.month]={};
    }
    if(!arr[current.year][current.month].hasOwnProperty(current.day)){//if day doesnt exist, create day
        arr[current.year][current.month][current.day]={
            id:current.day_of_month,
            nof_of_clients:1,
            total_balance:current.balance
        }
    }else{//if day already exists, add 1 to the number of client and add the balance to total balance
         arr[current.year][current.month][current.day].nof_of_clients+=1;
         arr[current.year][current.month][current.day].total_balance+=current.balance;
    }
}    

这是一个完整的小提琴: http : //jsfiddle.net/juvian/3auBG/1/

首先遍历Result我们使用Date方法从joinDate字符串创建日期对象,然后按年/月/日顺序将项目分组到新对象groupedResult

var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];

var groupedResult = [];
for (var i = 0; i < Result.length; i++)
{
    var date = new Date(Result[i].joinDate), day = date.getDate(), month = months[date.getMonth()], year = date.getFullYear(), d = "day " + day;

    if (!groupedResult.hasOwnProperty(year)) groupedResult[year] = {};
    if (!groupedResult[year].hasOwnProperty(month)) groupedResult[year][month] = {};
    if (groupedResult[year][month].hasOwnProperty(d))
    {
        groupedResult[year][month][d].no_of_clients += 1;
        groupedResult[year][month][d].balance += Result[i].balance;
    }
    else groupedResult[year][month][d] = {"id": day, "no_of_clients": 1, "balance": Result[i].balance};
}

演示版

这是一个示例: http : //jsfiddle.net/Pnax8/1

  • 遍历结果数组
  • 解析日期(使用正则表达式,可以使用momentjs代替),并检查其是否已存在于我们的对象RegExp("^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2})T([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})(.([0-9]+))?Z$")
  • 如果没有,请创建一个新条目
  • 添加到客户数量和总余额中

这里是思想者:

  • 编写一个新的js类,它具有day,nof_of_clients,total_balance,
  • 为对象编写排序函数objSortFun(a,b),按天进行比较,
  • 创建一个类型的数组,
  • 编写一个add方法,它首先查找现有的日期,您可以按1进行1,但最好通过二进制搜索来完成,如果找到则将值追加到它,如果找不到则创建一个新对象,并调用Array.sort(arr ,objSortFun)方法进行排序,
  • 为返回的json数组中的每个对象调用add方法,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM