Javascript - 数据聚合/求和值

标签 javascript jquery underscore.js

我有一个如下所示的对象数组

[Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]

数组中有数百个对象。下面展开其中的一些 -

0
:
Object
EVENT_TYPE_1:3
EVENT_TYPE_2:0
EVENT_TYPE_3:2
EVENT_TYPE_4:6
EVENT_TYPE_5:
EVENT_TYPE_6:0
EVENT_TYPE_7:0
EVENT_TYPE_8:26
EVENT_DATE:"2016-05-05"

1
:
Object
EVENT_TYPE_1:3
EVENT_TYPE_2:0
EVENT_TYPE_3:2
EVENT_TYPE_4:6
EVENT_TYPE_5:15
EVENT_TYPE_6:43
EVENT_TYPE_7:0
EVENT_TYPE_8:26
EVENT_DATE:"2016-05-06"

2
:
Object
EVENT_TYPE_1:30
EVENT_TYPE_2:0
EVENT_TYPE_3:20
EVENT_TYPE_4:6
EVENT_TYPE_5:1
EVENT_TYPE_6:0
EVENT_TYPE_7:10
EVENT_TYPE_8:26
EVENT_DATE:"2016-05-07"

3
:
Object
EVENT_TYPE_1:3
EVENT_TYPE_2:0
EVENT_TYPE_3:27
EVENT_TYPE_4:6
EVENT_TYPE_5:154
EVENT_TYPE_6:0
EVENT_TYPE_7:87
EVENT_TYPE_8:45
EVENT_DATE:"2016-05-08"

我想将一周中各天的每个 EVENT_TYPE 的值相加并生成如下输出 -

[
{EVENT_DATE:SUN,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for SUN}
{EVENT_DATE:MON,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for MON}
{EVENT_DATE:TUE,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for TUE}
{EVENT_DATE:WED,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for WED}
{EVENT_DATE:THU,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for THU}
{EVENT_DATE:FRI,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for FRI}
{EVENT_DATE:SAT,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for SAT}

{EVENT_DATE:SUN,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for SUN}
{EVENT_DATE:MON,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for MON}
{EVENT_DATE:TUE,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for TUE}
{EVENT_DATE:WED,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for WED}
{EVENT_DATE:THU,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for THU}
{EVENT_DATE:FRI,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for FRI}
{EVENT_DATE:SAT,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for SAT}

{EVENT_DATE:SUN,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for SUN}
{EVENT_DATE:MON,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for MON}
{EVENT_DATE:TUE,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for TUE}
{EVENT_DATE:WED,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for WED}
{EVENT_DATE:THU,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for THU}
{EVENT_DATE:FRI,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for FRI}
{EVENT_DATE:SAT,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for SAT}  

{EVENT_DATE:SUN,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for SUN}
{EVENT_DATE:MON,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for MON}
{EVENT_DATE:TUE,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for TUE}
{EVENT_DATE:WED,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for WED}
{EVENT_DATE:THU,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for THU}
{EVENT_DATE:FRI,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for FRI}
{EVENT_DATE:SAT,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for SAT}

{EVENT_DATE:SUN,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for SUN}
{EVENT_DATE:MON,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for MON}
{EVENT_DATE:TUE,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for TUE}
{EVENT_DATE:WED,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for WED}
{EVENT_DATE:THU,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for THU}
{EVENT_DATE:FRI,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for FRI}
{EVENT_DATE:SAT,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for SAT}  

{EVENT_DATE:SUN,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for SUN}
{EVENT_DATE:MON,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for MON}
{EVENT_DATE:TUE,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for TUE}
{EVENT_DATE:WED,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for WED}
{EVENT_DATE:THU,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for THU}
{EVENT_DATE:FRI,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for FRI}
{EVENT_DATE:SAT,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for SAT}      

{EVENT_DATE:SUN,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for SUN}
{EVENT_DATE:MON,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for MON}
{EVENT_DATE:TUE,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for TUE}
{EVENT_DATE:WED,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for WED}
{EVENT_DATE:THU,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for THU}
{EVENT_DATE:FRI,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for FRI}
{EVENT_DATE:SAT,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for SAT}  

{EVENT_DATE:SUN,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for SUN}
{EVENT_DATE:MON,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for MON}
{EVENT_DATE:TUE,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for TUE}
{EVENT_DATE:WED,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for WED}
{EVENT_DATE:THU,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for THU}
{EVENT_DATE:FRI,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for FRI}
{EVENT_DATE:SAT,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for SAT}          
]

这是我迄今为止尝试过的 -

function aggregateData(jsonData, dateField) {
    console.log(jsonData);

    // Days of week
    var dayOfWeek = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];

    // Result array
    var resultArray = [];

    // Counters
    var i, j, k, z;

    // Scan through the days of the week
    for (i = 0; i < dayOfWeek.length; i++) {

        // Loop through the dataprovider
        for (k = 0; k < jsonData.length; k++) {

            var curr_keyset = _.keys(jsonData[k]);
            var curr_valset = _.values(jsonData[k]);

            // Loop through current item of the data set
            for (z = 0; z < curr_keyset.length; z++) {

                // Day of week of current date
                var dow = dateFormat(new Date(curr_valset[curr_keyset.indexOf(dateField)]), "ddd").toUpperCase();
                resultArray[dow][curr_keyset[z]] += vals[k];
            }
        }
    }
}

aggregateData(jsonData, 'EVENT_DATE'); //passing JSON data & the field name that is the DATE field

这显然有一些错误。我可以请求帮助来纠正这个问题吗?当我问这个问题时,我也在尝试。如果我设法让它工作,我会报告。

当前代码

var accumulation = {};
var resultArr = [];
jsonData.forEach(function (daily) {
    //     var dow = dows[dateFormat(new Date(daily[dateField]), "ddd").toUpperCase()];
    var dow = dateFormat(new Date(daily[dateField]), "ddd").toUpperCase();
    for (var p in daily) {
        if (p.indexOf(dateField) === -1) {
            accumulation[p] = accumulation[p] | {}; // init if necessary
            accumulation[p][dow] = daily[p][dow] | 0; // init if necessary
            var valueToAdd = daily[p];
            accumulation[p][dow] += valueToAdd;
        }
    }
    resultArr[i] = accumulation;
});
console.log(accumulation);

最佳答案

注意 - 我不确定“jsonData”与“对象数组”有何具体关系 - 我假设 jsonData 不是字符串,实际上此时是一个对象数组,我将跳过下划线的东西,因为它并没有给这里带来太多(也许 groupBy() 和 reduce() 可以在...中工作)

您可能想稍微重新排序一下。首先,设置一个可以将东西积累到其中的对象:

   // example data
    var jsonData = [
    {EVENT_DATE:"SUN", EVENT_TYPE_1:3, EVENT_TYPE_2:0, EVENT_TYPE_3:2, EVENT_TYPE_4:6, EVENT_TYPE_5:0, EVENT_TYPE_6:0, EVENT_TYPE_7:0, EVENT_TYPE_8:26},
    {EVENT_DATE:"MON", EVENT_TYPE_1:3, EVENT_TYPE_2:0, EVENT_TYPE_3:2, EVENT_TYPE_4:6, EVENT_TYPE_5:0, EVENT_TYPE_6:0, EVENT_TYPE_7:0, EVENT_TYPE_8:26},
    {EVENT_DATE:"TUES", EVENT_TYPE_1:3, EVENT_TYPE_2:0, EVENT_TYPE_3:2, EVENT_TYPE_4:6, EVENT_TYPE_5:0, EVENT_TYPE_6:0, EVENT_TYPE_7:0, EVENT_TYPE_8:26},
    {EVENT_DATE:"WED", EVENT_TYPE_1:3, EVENT_TYPE_2:0, EVENT_TYPE_3:2, EVENT_TYPE_4:6, EVENT_TYPE_5:0, EVENT_TYPE_6:0, EVENT_TYPE_7:0, EVENT_TYPE_8:26},
    {EVENT_DATE:"SUN", EVENT_TYPE_1:3, EVENT_TYPE_2:0, EVENT_TYPE_3:2, EVENT_TYPE_4:6, EVENT_TYPE_5:0, EVENT_TYPE_6:0, EVENT_TYPE_7:0, EVENT_TYPE_8:26}
    ];

   // accumulate counts
    var accumulation = {};
    jsonData.forEach(function(daily) {
        var dow = daily.EVENT_DATE;
        for (var p in daily) {
            if (p.startsWith('EVENT_TYPE')) {
                accumulation[p] = accumulation[p] || {}; // init if necessary
                accumulation[p][dow] = accumulation[p][dow] || 0; // init if necessary
                accumulation[p][dow] += daily[p]
            }
        }
    })
    console.log(accumulation);

    // flatten to results
    var flat = [];
    for (var et in accumulation) {
        for (var dow in accumulation[et]) {
            var fi = {EVENT_DATE : dow};
            fi[et] = accumulation[et][dow];
            flat.push(fi)
        }
    }
    console.log(flat)

现在你有了 eventTypes -> daysOfWeek -> count 的散列...从这里压平散列以获得所需的格式应该是微不足道的。

关于Javascript - 数据聚合/求和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38780731/

相关文章:

php - Javascript onclick 与 getElementById 不起作用

jquery - 使用jquery动态设置两个元素的高度

javascript - 主干 :CRUD - (create)Post Data - save is not a function

functional-programming - 全局命名空间中的 JavaScript 库函数 - 缺点?

javascript - 带有 args 下划线的去抖功能

javascript - Node 服务器 http close 事件总是触发

javascript - JSON.parse 嵌套JSON字符串属性解析

c# - 如何使用 jQuery 数据表和 ASP MVC 进行批量行更新

jquery - codeigniter 保存帖子两次

jquery - 使用 css/jquery 隐藏较小的背景图像