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 (eg reduce, map, etc.). Cheers!
If you care code performance (efficiency) that much, You would like this...
const arr = [ { "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" }, ]; const results = []; const findItem = {}; for (const { avl_res, code, res_status } of arr) { let item = findItem[code]; const res = res_status == 'Available'? avl_res: 0; if (item) { item.total_res += avl_res; item.avl_res += res; } else { item = { avl_res: res, total_res: avl_res, code }; results.push(item); findItem[code] = item; } } console.log(results);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.