计算 json 个数组对象并使用 SUM 结果创建一个新数组

Counting json array objects and create a new array with SUM result

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

有人可以帮我一下吗?将不胜感激。谢谢

找到下面的解决方案

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

功能解决方案:

The reduce() method executes a reducer function (that you provide) on each element of the array, resulting in single output value.

The reducer function takes four arguments: Accumulator, Current Value, Current Index and Source Array

More info see: 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);

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