首页 > 解决方案 > 我想从 jquery 中的 jason 数组中获取每天每个团队编号的数量

问题描述

我有一个这样的 JSON 数组,我想按天计算每个团队的人数。

      const arrayVal = [{
            "DATE": "2020-12-1",
            "NAME": "JAKE",
            "TEAM_NO": 2,
            
        }, {
            "DATE": "2020-12-1",
            "NAME": "ANNA",
            "TEAM_NO": 2,
            
        }, {
            "DATE": "2020-12-1",
            "NAME": "JEFF",
            "TEAM_NO": 1,
            
        }, {
            "DATE": "2020-12-1",
            "NAME": "ERIKA",
            "TEAM_NO": 2,
           
        }, {
            "DATE": "2020-12-1",
            "NAME": "SUTTON",
            "TEAM_NO": 3,
        }, {
            "DATE": "2020-12-1",
            "NAME": "ARNOLD",
            "TEAM_NO": 3,
             
        }, {
            "DATE": "2020-12-2",
            "NAME": "JAKE",
            "TEAM_NO": 4,
             
        }, {
            "DATE": "2020-12-2",
            "NAME": "ANNA",
            "TEAM_NO": 2,
             
        }, {
            "DATE": "2020-12-2",
            "NAME": "JEFF",
            "TEAM_NO": 1,
             
        }, {
            "DATE": "2020-12-2",
            "NAME": "ERIKA",
            "TEAM_NO": 3,
             
        }, {
            "DATE": "2020-12-2",
            "NAME": "SUTTON",
            "TEAM_NO": 5,
             
        }, {
            "DATE": "2020-12-2",
            "NAME": "ARNOLD",
            "TEAM_NO": 5,
             
        }, {
            "DATE": "2020-12-3",
            "NAME": "JAKE",
            "TEAM_NO": 1,
             
        }, {
            "DATE": "2020-12-3",
            "NAME": "ANNA",
            "TEAM_NO": 1,
             
        }, {
            "DATE": "2020-12-3",
            "NAME": "JEFF",
            "TEAM_NO": 1,
             
        }, {
            "DATE": "2020-12-3",
            "NAME": "ERIKA",
            "TEAM_NO": 2,
             
        }, {
            "DATE": "2020-12-3",
            "NAME": "SUTTON",
            "TEAM_NO": 3,
             
        }, {
            "DATE": "2020-12-3",
            "NAME": "ARNOLD",
            "TEAM_NO": 3,
              
        }];

从上面的数组我需要这样的东西

    {
      "2020-12-1" : {
        1: 2, // 2 entries with no 1 team
        2: 3, // 3 entries with no 2 team
        // ...
      },
      "2020-12-2" : {
        // ...
      }
    }

到目前为止,我有下面的代码行,它们给了我一个 json 对象。我需要帮助才能在该对象内或作为数组获得上述结果。如果有更好的方法可以做到这一点,请建议我。

    TEAM_NO_COUNT = {}; // create an object
    $.each(JSON.parse(JSON.stringify(arrayVal)), function (key, val) {
      
      TEAM_NO_COUNT[val.DATE] = (TEAM_NO_COUNT[val.DATE] || 0);
      
    });

    alert(JSON.stringify(TEAM_NO_COUNT));

请有人指导我如何做到这一点?

标签: javascriptjqueryarraysjson

解决方案


这可以通过一个相当简单的聚合来完成,使用reduce

var result = arrayVal.reduce( (acc,x) => {
  if(!acc[x.DATE]) acc[x.DATE] = {}
  if(!acc[x.DATE][x.TEAM_NO]) acc[x.DATE][x.TEAM_NO] = 0
  acc[x.DATE][x.TEAM_NO]++
  return acc;
}, {});

如您所见,不需要

  • jQuery$.each
  • JSON.parse(JSON.stringify(arrayVal))- 数据已经是一个 javascript 数组

下面的实时示例:

const arrayVal = [{
  "DATE": "2020-12-1",
  "NAME": "JAKE",
  "TEAM_NO": 2,
}, {
  "DATE": "2020-12-1",
  "NAME": "ANNA",
  "TEAM_NO": 2,
}, {
  "DATE": "2020-12-1",
  "NAME": "JEFF",
  "TEAM_NO": 1,
}, {
  "DATE": "2020-12-1",
  "NAME": "ERIKA",
  "TEAM_NO": 2,
}, {
  "DATE": "2020-12-1",
  "NAME": "SUTTON",
  "TEAM_NO": 3,
}, {
  "DATE": "2020-12-1",
  "NAME": "ARNOLD",
  "TEAM_NO": 3,
}, {
  "DATE": "2020-12-2",
  "NAME": "JAKE",
  "TEAM_NO": 4,
}, {
  "DATE": "2020-12-2",
  "NAME": "ANNA",
  "TEAM_NO": 2,
}, {
  "DATE": "2020-12-2",
  "NAME": "JEFF",
  "TEAM_NO": 1,
}, {
  "DATE": "2020-12-2",
  "NAME": "ERIKA",
  "TEAM_NO": 3,
}, {
  "DATE": "2020-12-2",
  "NAME": "SUTTON",
  "TEAM_NO": 5,
}, {
  "DATE": "2020-12-2",
  "NAME": "ARNOLD",
  "TEAM_NO": 5,
}, {
  "DATE": "2020-12-3",
  "NAME": "JAKE",
  "TEAM_NO": 1,
}, {
  "DATE": "2020-12-3",
  "NAME": "ANNA",
  "TEAM_NO": 1,
}, {
  "DATE": "2020-12-3",
  "NAME": "JEFF",
  "TEAM_NO": 1,
}, {
  "DATE": "2020-12-3",
  "NAME": "ERIKA",
  "TEAM_NO": 2,
}, {
  "DATE": "2020-12-3",
  "NAME": "SUTTON",
  "TEAM_NO": 3,
}, {
  "DATE": "2020-12-3",
  "NAME": "ARNOLD",
  "TEAM_NO": 3,
}];

var result = arrayVal.reduce( (acc,x) => {
  if(!acc[x.DATE]) acc[x.DATE] = {}
  if(!acc[x.DATE][x.TEAM_NO]) acc[x.DATE][x.TEAM_NO] = 0
  acc[x.DATE][x.TEAM_NO]++
  return acc;
}, {})

console.log(result)


推荐阅读