javascript - 如何在java脚本对象ES5中分组和合并
问题描述
我有一个这样的对象
{
"User 1":[
{"count":"1","stage":"A","jCount":"10","name":"User 1","stageId":"A1"},
{"count":"8","stage":"B","jCount":"10","name":"User 1","stageId":"B1"},
],
"User 2":[
{"count":"7","stage":"C","jCount":"8","name":"User 2","stageId":"C1"},
{"count":"8","stage":"B","jCount":"8","name":"User 2","stageId":"B1"},
{"count":"9","stage":"A","jCount":"8","name":"User 2","stageId":"A1"},
{"count":"8","stage":"D","jCount":"8","name":"User 2","stageId":"D1"},
],
"User 3":[
{"count":"6","stage":"D","jCount":"6","name":"User 3","stageId":"D1"},
{"count":"8","stage":"B","jCount":"6","name":"User 3","stageId":"B1"},
{"count":"1","stage":"A","jCount":"6","name":"User 3","stageId":"A1"},
],
/* Many more users */
}
我正在尝试以这种格式更改我的对象
[
{
"name":"User 1",
"jCount":10,
"stageIdCountA1":1,
"stageIdCountB1":8,
"stageIdCountC1":0,
"stageIdCountD1":0,
},{
"name":"User 2",
"jCount":8,
"stageIdCountA1":9,
"stageIdCountB1":8,
"stageIdCountC1":7,
"stageIdCountD1":8,
},{
"name":"User 3",
"jCount":6,
"stageIdCountA1":1,
"stageIdCountB1":8,
"stageIdCountC1":0,
"stageIdCountD1":6,
},
/* Many more users */
]
最多只有 4 个阶段A1,B1,C1,D1和jCount在子对象的用户数组中很常见
如果没有阶段,它应该打印0
我试图在 angularjs 视图中进行操作,但它变得很困难。
解决方案
您可以使用map
将每个用户对象映射到数组中的项目,并reduce
在 map 函数内部将阶段数组转换为单个对象:
const input={"User 1":[{"count":"1","stage":"A","jCount":"10","name":"User 1","stageId":"A1"},{"count":"8","stage":"B","jCount":"10","name":"User 1","stageId":"B1"},],"User 2":[{"count":"7","stage":"C","jCount":"8","name":"User 2","stageId":"C1"},{"count":"8","stage":"B","jCount":"8","name":"User 2","stageId":"B1"},{"count":"9","stage":"A","jCount":"8","name":"User 2","stageId":"A1"},{"count":"8","stage":"D","jCount":"8","name":"User 2","stageId":"D1"},],"User 3":[{"count":"6","stage":"D","jCount":"6","name":"User 3","stageId":"D1"},{"count":"8","stage":"B","jCount":"6","name":"User 3","stageId":"B1"},{"count":"1","stage":"A","jCount":"6","name":"User 3","stageId":"A1"},],};
const stages = ['A', 'B', 'C', 'D'];
const output = Object.entries(input).map(([name, arr]) => {
const { jCount } = arr[0];
const stageCounts = stages.reduce((a, stageName) => {
const propName = 'stageIdCount' + stageName;
const foundStage = arr.find(({ stage }) => stageName === stage);
const count = foundStage ? foundStage.count : 0;
a[propName] = count;
return a;
}, {});
return { name, jCount, ...stageCounts };
});
console.log(output);
如果你不能使用扩展语法(如果可能的话,你应该将 Babel 集成到你的构建过程中),然后替换
return { name, jCount, ...stageCounts };
和
return Object.assign({ name, jCount }, stageCounts);
推荐阅读
- javascript - 如何从字符串中获取值并将其多次写入输出文本文件中,并且每次都创建新行?
- html - 如何隐藏
我的网站上有一个要删除的标签。我网站上的一项功能似乎是添加标签。我想知道是否可以使用 CSS 删除标签?标签看起来像这样。
<p data-f-id="pbf" style="text-align: center; font-size: 14px; margin-top: 30px; opacity: 0.65; fon
- spring-boot - 如何使用 Mockito 模拟内部类实例
- pine-script - 如何从 pinescript 绘制像使用绘图工具的多头和空头头寸?
- permissions - keycloak - 肯定策略的表现不如预期
- npm - 当我输入 npm run dev.I 时出现错误
- node.js - 如何以屏幕宽度的一半打开铬并与右屏幕边框对齐?
- pandas - Pandas groupby 自定义 nlargest
- db2 - 放大主键中的列时出现 Db2 错误
- java - 如何将一个表的列数据迁移为另一个表的列,这两个表都属于不同的数据库