javascript - 计算 json 数组对象并使用 SUM 结果创建一个新数组
问题描述
我有一个像这样的 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));
有人可以帮我吗。将不胜感激。谢谢。
解决方案
功能解决方案:
reduce() 方法对数组的每个元素执行一个 reducer 函数(您提供),从而产生单个输出值。
reducer 函数有四个参数:累加器、当前值、当前索引和源数组
更多信息请参阅:MDN 网络文档 - 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);
通过这个方向,您可以重建整个对象数组。如果您需要扩展此数据,它会很有用。例如,如果您想包含球员姓名列表。
推荐阅读
- vimeo - 如何在开发过程中测试 Vimeo API
- javascript - 错误-:8080/:1 GET http://localhost:8080/404 (OK)
- javascript - 使用 lodash 仅获取非空白的对象键值
- python - 如何基于 RIDE python 机器人框架将日期格式从 dd/mm/yyyy 转换为 yyyy-mm-dd
- google-cloud-platform - JMeter 测试结果 - 连接时间是请求 (HTTP) 采样时间的 100%
- python - 如何使用opencv python提取表格行上方的文本内容?
- javascript - 带有选择选项的 vuejs2 获取值和其他属性
- elasticsearch - ElasticSearch - 在 query_string 中使用“现在”范围返回 0 个命中
- haskell - 如何为 Church 编码的免费 monad 编写展开器?(Haskell)
- node.js - github操作工作流程:生命周期中的不安全烫发真