I have an array like this:
[
{ "avl_res": 1, "res_status": "Available", "code": "AAA" },
{ "avl_res": 2, "res_status": "Unavailable", "code": "AAA" },
{ "avl_res": 2, "res_status": "Available", "code": "BBB" },
{ "avl_res": 1, "res_status": "Available", "code": "CCC" },
{ "avl_res": 5, "res_status": "Unavailable", "code": "CCC" },
{ "avl_res": 3, "res_status": "Unavailable", "code": "DDD" },
];
I am trying to produce this:
[
{"avl_res":1,"total_res":3,"code":"AAA"},
{"avl_res":2,"total_res":2,"code":"BBB"},
{"avl_res":1,"total_res":6,"code":"CCC"},
{"avl_res":0,"total_res":3,"code":"DDD"},
];
Following the answer to this question, I managed to do it with this:
var singles = {};
arr.forEach(function (item) {
var single = singles[item.code] = singles[item.code] || {};
single[item.res_status] = item.avl_res;
});
var outputList = [];
for (var single in singles) {
let total_res = 0;
let avl_res = 0;
singles[single]['Available'] ? avl_res = singles[single]['Available'] : avl_res = 0;
singles[single]['Unavailable'] ? total_res = avl_res + singles[single]['Unavailable'] : total_res = avl_res;
outputList.push({ code: single, total_res: total_res, avl_res: avl_res });
}
console.log(outputList);
Just wondering if this is efficient enough or there's a better/elegant way, maybe by using other JS functions (e.g. reduce, map, etc.). Cheers!