【问题标题】:recreate a json response based on existing response根据现有响应重新创建 json 响应
【发布时间】:2020-07-30 10:44:09
【问题描述】:

我有 json 响应,其值为 week1、week2、week3、week4 在 week 键以及基于类别 (meetingHash) 和周明智的计数。我尝试与 .reduce 合并但没有运气

const data=[
  {
    "UserName": "Sarathy Devaraju",
    "week": "Week 1",
    "MeetingHash": "Hold/Uncategorized",
    "monthinwords": "May",
    "count": 2
  },
  {
    "UserName": "Sarathy Devaraju",
    "week": "Week 2",
    "MeetingHash": "1st Presentation / Meeting",
    "monthinwords": "Jun",
    "count": 1
  },
  {
    "UserName": "Sarathy Devaraju",
    "week": "Week 1",
    "MeetingHash": "Follow-On Meetings",
    "monthinwords": "Jun",
    "count": 1
  },
  {
    "UserName": "Sarathy Devaraju",
    "week": "Week 2",
    "MeetingHash": "1st Presentation / Meeting",
    "monthinwords": "May",
    "count": 1
  },
  {
    "UserName": "Sarathy Devaraju",
    "week": "Week 3",
    "MeetingHash": "Follow-On Meetings",
    "monthinwords": "July",
    "count": 1
  },
  {
    "UserName": "Priya",
    "week": "Week 1",
    "MeetingHash": "Hold/Uncategorized",
    "monthinwords": "May",
    "count": 2
  },
  {
    "UserName": "Priya",
    "week": "Week 2",
    "MeetingHash": "1st Presentation / Meeting",
    "monthinwords": "Jun",
    "count": 1
  },
  {
    "UserName": "Priya",
    "week": "Week 1",
    "MeetingHash": "Follow-On Meetings",
    "monthinwords": "Jun",
    "count": 1
  },
  {
    "UserName": "Priya",
    "week": "Week 2",
    "MeetingHash": "1st Presentation / Meeting",
    "monthinwords": "May",
    "count": 1
  },
  {
    "UserName": "Priya",
    "week": "Week 1",
    "MeetingHash": "Follow-On Meetings",
    "monthinwords": "July",
    "count": 1
  }
];
const stages = data.reduce((res, row) => {
  if (!res.includes(row.week)) res.push(row.week);
  return res;
}, []);
console.log(stages);
const obj = data.reduce((res, row) => {
  if (!res[row.week]) {
    res[row.week] = Object.fromEntries([ ['week', row.week], ...stages.map(s => [s, 0]) ]);
  }
  
  return res;
}, {});
console.log(obj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

我想把json组合成

[{"UserName":"Sarathy Devaraju","month":"May","meetingHash":"Hold/Uncategorized","Week1":2,"Week2":0,"Week3":0,"Week4":0},
          {"UserName":"Priya","month":"May","meetingHash":"Hold/Uncategorized","Week1":2,"Week2":0,"Week3":0,"Week4":0},
          {"UserName":"Sarathy Devaraju","month":"May","meetingHash":"1st Presentation / Meeting","Week1":0,"Week2":1,"Week3":0,"Week4":0},
          {"UserName":"Priya","month":"May","meetingHash":"1st Presentation / Meeting","Week1":0,"Week2":1,"Week3":0,"Week4":0},
          {"UserName":"Sarathy Devaraju","month":"Jun","meetingHash":"1st Presentation / Meeting","Week1":0,"Week2":1,"Week3":0,"Week4":0},
          {"UserName":"Priya","month":"Jun","meetingHash":"1st Presentation / Meeting","Week1":0,"Week2":1,"Week3":0,"Week4":0},
          {"UserName":"Sarathy Devaraju","month":"Jun","meetingHash":"Follow-On Meetings","Week1":1,"Week2":0,"Week3":0,"Week4":0},
          {"UserName":"Priya","month":"Jun","meetingHash":"Follow-On Meetings","Week1":1,"Week2":0,"Week3":0,"Week4":0},
          {"UserName":"Sarathy Devaraju","month":"Jul","meetingHash":"Follow-On Meetings","Week1":0,"Week2":0,"Week3":1,"Week4":0},
          {"UserName":"Sarathy Devaraju","month":"Jul","meetingHash":"Follow-On Meetings","Week1":1,"Week2":0,"Week3":0,"Week4":0},
         ]

【问题讨论】:

    标签: javascript html jquery json


    【解决方案1】:

    你需要使用map而不是reduce!

    const data = [
        {
            "UserName": "Sarathy Devaraju",
            "week": "Week 1",
            "MeetingHash": "Hold/Uncategorized",
            "monthinwords": "May",
            "count": 2
        },
        {
            "UserName": "Sarathy Devaraju",
            "week": "Week 2",
            "MeetingHash": "Hold/Uncategorized",
            "monthinwords": "May",
            "count": 3
        },
        {
            "UserName": "Sarathy Devaraju",
            "week": "Week 2",
            "MeetingHash": "1st Presentation / Meeting",
            "monthinwords": "Jun",
            "count": 1
        },
        {
            "UserName": "Sarathy Devaraju",
            "week": "Week 1",
            "MeetingHash": "Follow-On Meetings",
            "monthinwords": "Jun",
            "count": 1
        },
        {
            "UserName": "Sarathy Devaraju",
            "week": "Week 2",
            "MeetingHash": "1st Presentation / Meeting",
            "monthinwords": "May",
            "count": 1
        },
        {
            "UserName": "Sarathy Devaraju",
            "week": "Week 3",
            "MeetingHash": "Follow-On Meetings",
            "monthinwords": "July",
            "count": 1
        },
        {
            "UserName": "Priya",
            "week": "Week 1",
            "MeetingHash": "Hold/Uncategorized",
            "monthinwords": "May",
            "count": 2
        },
        {
            "UserName": "Priya",
            "week": "Week 2",
            "MeetingHash": "1st Presentation / Meeting",
            "monthinwords": "Jun",
            "count": 1
        },
        {
            "UserName": "Priya",
            "week": "Week 1",
            "MeetingHash": "Follow-On Meetings",
            "monthinwords": "Jun",
            "count": 1
        },
        {
            "UserName": "Priya",
            "week": "Week 2",
            "MeetingHash": "1st Presentation / Meeting",
            "monthinwords": "May",
            "count": 1
        },
        {
            "UserName": "Priya",
            "week": "Week 1",
            "MeetingHash": "Follow-On Meetings",
            "monthinwords": "July",
            "count": 1
        }
    ];
    
    const WEEKS = ["Week 1", "Week 2", "Week 3", "Week 4"];
    
    /*
        const result = data.map(obj => {
                return {
                    UserName: obj.UserName,
                    month: obj.monthinwords,
                    meetingHash: obj.MeetingHash,
                    Week1: WEEKS.indexOf(obj.week) == 0 ? obj.count : 0,
                    Week2: WEEKS.indexOf(obj.week) == 1 ? obj.count : 0,
                    Week3: WEEKS.indexOf(obj.week) == 2 ? obj.count : 0,
                    Week4: WEEKS.indexOf(obj.week) == 3 ? obj.count : 0,
                }
            }
        );
    */
    
    const result = data.reduce((acc, obj) => {
        existingObj = acc.find(ele => ele.UserName == obj.UserName && ele.month == obj.monthinwords && ele.meetingHash == obj.MeetingHash)
        if (existingObj) {
            existingObj.Week1 += WEEKS.indexOf(obj.week) == 0 ? obj.count : 0;
            existingObj.Week2 += WEEKS.indexOf(obj.week) == 1 ? obj.count : 0;
            existingObj.Week3 += WEEKS.indexOf(obj.week) == 2 ? obj.count : 0;
            existingObj.Week4 += WEEKS.indexOf(obj.week) == 3 ? obj.count : 0;
        } else {
            acc.push({
                UserName: obj.UserName,
                month: obj.monthinwords,
                meetingHash: obj.MeetingHash,
                Week1: WEEKS.indexOf(obj.week) == 0 ? obj.count : 0,
                Week2: WEEKS.indexOf(obj.week) == 1 ? obj.count : 0,
                Week3: WEEKS.indexOf(obj.week) == 2 ? obj.count : 0,
                Week4: WEEKS.indexOf(obj.week) == 3 ? obj.count : 0,
            });
        }
        return acc;
    }, []);
    
    console.log(result);

    【讨论】:

    • 如果我有第 1 周和第 2 周的用户 Sarathy Devaraju 在月份的 meetingHash 'Hold/Uncategorized' 现在可能显示 2 行。但我想合并为 { meetingHash: "Hold/Uncategorized", month : "May", UserName: "Sarathy Devaraju", Week1: 2, Week2: 0, Week3: 3, Week4: 0 } 请检查小提琴jsfiddle.net/0tuqc2d3
    • @user3386779,在这种情况下你需要使用reduce!请参考修改后的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 2014-12-26
    • 2015-02-11
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多