JSON数据 - 使用Javascript / Jquery按星期几(星期一,星期一,星期二,星期三,星期四,星期五,星期六)分组 [英] JSON data - Group by days of the week(Sun,Mon,Tue, Wed,Thu,Fri,Sat) using Javascript/Jquery

查看:162
本文介绍了JSON数据 - 使用Javascript / Jquery按星期几(星期一,星期一,星期二,星期三,星期四,星期五,星期六)分组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下函数返回图表数据

上述函数返回的输出格式如下

The output returned by the above function is in the below format

[Object { date=Date,  value=112,  volume=1469}, Object { date=Date,  value=124,  volume=539}, Object { date=Date,  value=114,  volume=859}, Object { date=Date,  value=123,  volume=1284}, Object { date=Date,  value=113,  volume=1382}, Object { date=Date,  value=129,  volume=1353}]

从上面的 getChartData 生成的输出,我很想看到以下类型的输出,其中01,02等是月份数字。这基本上是将数据汇总到每月的星期几。

From the output generated by getChartData above, I'm eager to see an output of the below kind where01,02 etc are the month numbers. This is basically aggregating data to the day of week level per month.

[{'dayofweek':'01-SUN','value':xxx,'volume':'yyy},{'dayofweek':'01-MON','value':xxx,'volume':'yyy},{'dayofweek':'01-TUE','value':xxx,'volume':'yyy},{'dayofweek':'01-WED','value':xxx,'volume':'yyy},{'dayofweek':'01-THU','value':xxx,'volume':'yyy},{'dayofweek':'01-FRI','value':xxx,'volume':'yyy},{'dayofweek':'01-SAT','value':xxx,'volume':'yyy}]

我是 JSON.stringify 输出 getChartData 数组,输出如下所示(显示此值为'date'字段可见

I were to JSON.stringify the output of getChartData the array, the output looks as below ( Showing this so that the value of 'date' field is visible

[{"date":"2014-10-06T06:00:00.000Z","value":119,"volume":1417},{"date":"2014-10-07T06:00:00.000Z","value":126,"volume":1421},{"date":"2014-10-08T06:00:00.000Z","value":140,"volume":850}]

上面的数组有几百个对象。我试图聚合这个达到值的总和& 音量逐个月的某一天水平的字段(星期日,星期一等等的星期几......周六)。

The above array has several hundred objects. I'm trying to aggregate this to achieve the sum of value & volume fields month by month at a day of the week level ( Total for Sunday, Monday etc .... Sat).

对象数组可以包含任何字段。我的意思是,我想编写一个动态函数,其中每个对象的第一个元素将是由任何变量名称(日期,xdate,ydate等)表示的日期字段。除了第一个字段之外的其余字段(有时可能有2个字段,3个字段或n个字段)需要加起来&汇总到每月的星期几水平

The object array can have any field. I mean, I'd like to write a dynamic function where the first element of every object will be a date field denoted by any variable name (date, xdate,ydate whatever). The rest of the fields apart from the first field(In sometimes there may be 2 fields, 3 fields or 'n' number of fields) needs to be added up & aggregated to day of week level per month

这是我正在做的事情

function setGroupingDayOfWeek(thisObj) {
  var chartData = getChartData("chartdiv");
  var keysOnly = Object.keys(chartData[0]);
  var objStruct = getObjStruct(keysOnly);
  var chartFeedJson = updatejsonStruct(objStruct,chartData)
}


function getObjStruct(keyArray) {
    //  var arrToObjContent = _.values(Object.keys(jsonData[0])),
  var arrToObjContent = keyArray,
    dayOfWeek = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"],
    i = 0,
    z,
    arrToObjLength = arrToObjContent.length,
    dayOfWeekLength = dayOfWeek.length,
    jsonObj = {},
    newObj,
    key,
    value;

  for (; i < dayOfWeekLength; i++) {
    newObj = {};
    for (z = 0; z < arrToObjLength; z++) {
      key = arrToObjContent[z];

      if (key === arrToObjContent[0]) {
        value = dayOfWeek[i];
      } else {
        value = "";
      }
      newObj[key] = value;
    }
    jsonObj[i] = newObj;
  }
  return jsonObj;
}


function updatejsonStruct(objStruct,chartData) {
    var baseStruct = objStruct,
        chartDataFormatted = JSON.stringify(chartData);
// The idea here is to first group it by months & then loop through & sum up all Sundays, Mondays etc to the end of week
    var groupedByMonth = _.groupBy(chartDataFormatted , function (item) {
        return item[0].substring(0, 9);
    });     
    console.log(groupedByMonth);
}

这不是按月分组数据。显然,我在聚合中做错了。关于这一点的一些问题 -

This isn't grouping data by months. obviously, I'm doing the wrong thing in the aggregation. A few questions with regards to this -

1)我怎么能使用 chartData 这是非格构化的版本&安培;按月分组

1) how could I use chartData which is the non-strigified version & group it by months

2)如果(1)是硬/复杂,我怎么能用 chartDataFormatted 来做按月分组

2) if (1) is hard/complex, how could I use chartDataFormatted to do the grouping by months

3)在此结束时,我想更新 objStruct 计算的详细信息(按周划分天数)

3) At the end of this, I'd like to update the objStruct with the details of the calculation ( Grouping by days ogf the week)

现在,这完全是我想到的,因为我没有Jquery或其他很酷的经验javacript图书馆。如果有更好的做法(不需要 baseStruct 或直接将数据汇总到所需的格式),我很高兴得到一些指导。

Now, this is entirely what I thought of doing as I don't have good experience with Jquery or other cool javacript libraries. If there is a better of doing this (Say without the need of baseStruct or directly aggregating data into the needed format), I'm excited to get some guidance.

如果我错过了您认为需要解释的内容,或者我没有清楚地沟通,请告诉我。我会尽力澄清。我一直坚持这个没有多少想法。因此,请求帮助。

If I've missed explaining something you think is needed or if I've not communicated clearly, please let me know. I'll try my best to clarify. I've been stuck with this with no much ideas. Hence, requesting help please.

尝试将分组减少到周一至周六 -

显然我没有以正确的方式访问对象数组。我们的想法是创建一个主数组,其中Mon-Sun是包含7个对象(一周中每天的一个对象)的对象数组中的众多字段之一。最终的对象数组应该每周只有7个对象。

Obviously I'm not accessing the object array in the right way. The idea is to create a master array having Mon - Sun as one of the many fields in an object array containing 7 objects ( One object for each day of the week). The final object array should have just 7 objects one per day of the week.

我怎样才能查看obejct数组&检查其中第0个字段的值?

How exactly can I look up the obejct array & check the value of zeroth field within it?

var days = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]
var chartData = getChartData("chartdiv");

//use var chartData = getChartData("chartdiv") here instead;
keys = Object.keys(chartData[0]);
var newObjStruct = [{},{},{},{},{},{},{}];

for(var k = 0; k < days.length; k++){
  for(var i = 0; i < keys.length; i++){
      if (i === 0) {
          newObjStruct[k]['dayOfWeek' ] = days[k];
      } else {
          newObjStruct[k][keys[i]] = "";          
  }
  }
}

console.log(newObjStruct);

for (j=0; j<chartData.length; j++){
var castObj = JSON.stringify(chartData[j]);
console.log(castObj[0]);
//val.date.getDay();
      for(k = 0; k < newObjStruct.length; k++) {
           if (newObjStruct[k][0] === days[day]) {
for(var i = 0; i < keys.length; i++){
              newObjStruct[k][i] += chartData[keys[i]];
          } 
           }          
  }
}


推荐答案

请参阅以下JS Fiddle链接: https://jsfiddle.net/ahu6kLvr/ 1 /

See the following JS Fiddle link: https://jsfiddle.net/ahu6kLvr/1/

var days = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'];

var testArray = [{"date":"2014-10-06T06:00:00.000Z","value":119,"volume":1417},{"date":"2014-10-06T06:00:00.000Z","value":119,"volume":1417},{"date":"2014-10-07T06:00:00.000Z","value":126,"volume":1421},{"date":"2014-10-08T06:00:00.000Z","value":140,"volume":850}];

var groupResult = _.groupBy(testArray, function (value) {
  var d = new Date(value.date);
    return (d.getMonth()+1) + "-" + days[d.getDay()]
});

var result = [];

_.each(groupResult, function (value, key) {
  var volumeSum = 0;
  var valueSum = _.reduce(value, function(memo, obj){ 
    //valueSum += obj.value;    
    volumeSum += obj.volume;
    return memo + obj.value; 
  }, 0);
  result.push({ dayofweek: key, value: valueSum, volume: volumeSum });
})
console.log(result);

您可以先按月和日分组,然后执行 reduce 将所有值和总和相加。关于你对其他答案的评论,我认为很难让这些领域变得动态。

You can first group by month and day, then do a reduce to sum all the values and volume. Regarding your comment to other answer, I think it is very difficult to make the fields dynamic.

编辑:
查看更新的小提琴: https://jsfiddle.net/ahu6kLvr/1/

var result = [];

_.each(groupResult, function (value, key) {
  var doc = _.reduce(value, function(memo, obj){
  delete obj.date;
   if (typeof(memo) == "number") {
    return obj;
   } else {
    for (var key in memo) {
        memo[key] += obj[key] || 0;
    }
    return memo;
   }
  }, 0);
  doc.dayOfWeek = key;
  result.push(doc);
})

这篇关于JSON数据 - 使用Javascript / Jquery按星期几(星期一,星期一,星期二,星期三,星期四,星期五,星期六)分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆