recreate a json response based on existing response

柔情痞子 提交于 2021-01-29 09:17:38

问题


I have the json response with value week1,week2,week3,week4 in week key along with count based on category (meetingHash)and week wise.I tried to merge with .reduce but no luck

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>

I want to combine the json as

[{"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},
         ]

回答1:


You need to use map not 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);


来源:https://stackoverflow.com/questions/63171480/recreate-a-json-response-based-on-existing-response

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!