【问题标题】:Counting json array objects and create a new array with SUM result计算 json 数组对象并使用 SUM 结果创建一个新数组
【发布时间】:2021-05-04 04:14:57
【问题描述】:

我有一个这样的 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,
      
}];

我只是想从上面的数组中得到下面的结果。在此我想按天计算团队人数并使用“TEAM_NO_COUNT”参数创建一个新数组。

[{
    "DATE": "2020-12-1",
    "TEAM_NO": 3, 
    "TEAM_NO_COUNT": 2, // 2 entries with no 3 team
     
}, {
    "DATE": "2020-12-1",
    "TEAM_NO": 1,
    "TEAM_NO_COUNT": 2,  // 2 entries with no 1 team
}, {
    "DATE": "2020-12-2",
    "TEAM_NO": 4,
    "TEAM_NO_COUNT": 1,  
}]

到目前为止,我有这段代码,但它只是给了我一个包含团队编号的 json 对象,但这不是我想要的,我需要上面的确切结果。

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

DATE_NO_CO = {};

  TEAM_NO_COUNT[val.DATE] = (TEAM_NO_COUNT[val.DATE] || {});

  TEAM_NO_COUNT[val.DATE][val.TEAM_NO] = (TEAM_NO_COUNT[val.DATE][val.TEAM_NO] || 0) + 1;
  
});

alert(JSON.stringify(TEAM_NO_COUNT));

谁能帮帮我。将不胜感激。谢谢。

【问题讨论】:

    标签: javascript jquery arrays json reduce


    【解决方案1】:

    在下面找到解决方案

    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,
    
    }];
    
    let finalArray = [];
    
    arrayVal.forEach((x) => {
        if (finalArray.length == 0) {
            finalArray.push({
                DATE: x.DATE,
                TEAM_NO: x.TEAM_NO,
                TEAM_NO_COUNT: 1
            });
        } else {
            let indexI, flag = false;
            finalArray.forEach((i, index) => {
    
                if (x.TEAM_NO == i.TEAM_NO && x.DATE== i.DATE) {
                    indexI = index;
                    flag = true;
                }
            });
            if (!flag) {
                finalArray.push({
                    DATE: x.DATE,
                    TEAM_NO: x.TEAM_NO,
                    TEAM_NO_COUNT: 1
                });
            } else {
                finalArray[indexI]["TEAM_NO_COUNT"] += 1;
            }
        }
    });
    
    console.log(finalArray);

    【讨论】:

      【解决方案2】:

      功能解决方案:

      reduce() 方法对数组的每个元素执行(您提供的)reducer 函数,从而产生单个输出值。

      reducer 函数有四个参数:累加器、当前值、当前索引和源数组

      更多信息见:MDN Web Docs - Reduce()

      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,
            
      }];
      
      const result = arrayVal.reduce((curr, entry) => {
          const {DATE, NAME, TEAM_NO} = entry;
        
        const newEntry = {DATE, TEAM_NO, "TEAM_NO_COUNT": 1};
          const currEntry = curr.find(currEntry => currEntry.DATE === DATE && currEntry.TEAM_NO === TEAM_NO);
        
        if(currEntry == null) {
          return [...curr, {...newEntry}];
        } else {
          return [
              ...curr.filter(currEntry => !(currEntry.DATE === DATE && currEntry.TEAM_NO === TEAM_NO)),
            {...newEntry, "TEAM_NO_COUNT": currEntry.TEAM_NO_COUNT + 1}
          ];
        }
      }, []);
      
      console.log(result);

      按照这个方向,您可以重建整个对象数组。如果您需要扩展此数据,它会很有用。例如,如果您想包含球员姓名列表。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多