JSON 数据 - 使用 Javascript/Jquery 按星期几(周日、周一、周二、周三、周四、周五、周六)分组

JSON data - Group by days of the week(Sun,Mon,Tue, Wed,Thu,Fri,Sat) using Javascript/Jquery

本文关键字:周二 周一 周三 周日 周四 分组 周六 周五 Javascript 使用 数据      更新时间:2023-09-26

下面的函数返回图表数据

上述函数返回的输出采用以下格式

[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 等是月份数字。这基本上是将数据聚合到每月的星期几级别。

[{'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'

可见
[{"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}]

上面的数组有几百个对象。我正在尝试将其汇总以在一周中的某一天逐月实现valuevolume字段的总和(周日、周一等的总数......周六)。

对象数组可以具有任何字段。我的意思是,我想编写一个动态函数,其中每个对象的第一个元素都是由任何变量名称(日期,xdate,ydate等)表示的日期字段。除第一个字段(有时可能有 2 个字段、3 个字段或"n"个字段)之外的其余字段需要加起来并聚合到每月的星期几级别

这是我正在做的

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

这不是按月对数据进行分组。 显然,我在聚合中做错了事情。关于这个的几个问题——

1)我如何使用非分级版本chartData并按月分组

2)如果(1)很难/复杂,我如何使用chartDataFormatted按月进行分组

3)最后,我想用计算的详细信息更新objStruct(按星期的天数分组)

现在,这完全是我想做的事情,因为我对Jquery或其他很酷的javacript库没有很好的经验。如果这样做更好(比如说不需要baseStruct或直接将数据聚合成所需的格式),我很高兴能得到一些指导。

如果我

错过了解释您认为需要的东西,或者如果我没有清楚地沟通,请告诉我。我会尽力澄清。我一直被困在这个上面,没有太多的想法。因此,请请求帮助。

试图将分组减少到周一到周六 -

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

我如何准确地查找 obejct 数组并检查其中第 0 个字段的值?

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/

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以对所有值和体积求和。关于您对其他答案的评论,我认为很难使字段动态化。

编辑:检查更新的小提琴: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);
})

这是部分动态的。条件适用对象的第一个键是日期对象。

var days = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]
//I have used new Date which gets the current date, you don't need that.
var chartData = [{ date:new Date,  value:112,  volume:1469}, { date:new Date,  value:124,  volume:539}, { date:new Date,  value:114,  volume:859}, { date:new Date,  value:123,  volume:1284}, { date:new Date,  value:113,  volume:1382}, { date:new Date,  value:129,  volume:1353}];
//use var chartData = getChartData("chartdiv") here instead;
keys = Object.keys(chartData[0]);
var newA = chartData.map(function(val, i){
  day = val.date.getDay();
  month = (val.date.getMonth() + 1).toString();
  month = month.length == 2 ? month : '0' + month;
  rtn = {};
  for(var i = 0; i < keys.length; i++){
      if(i == 0){
          rtn[ 'dayOfWeek' ] = month + '-' + days[day];
      } else {
          rtn[ keys[i] ] = val[keys[i]];
      }
  }
  return rtn;
})
document.write(JSON.stringify(newA))