Вы можете попробовать это следующим образом.
https://jsfiddle.net/o3016bh7/
Просто сказать, что есть класс для вашего {id, "Passed", "Failed"}, и он может считать целые числа позади«Passed» и «Failed».
class PassFailCounter {
constructor(id) {
this.id = id;
this.Passed = 0;
this.Failed = 0;
}
addPass() {
this.Passed++;
}
addFail() {
this.Failed++;
}
}
Просто прочитайте данные и запомните их в Hashmap, подразумевая, что id уникален.После этого JSON.stringify () возвращает .values () указанной карты, и вы получите точный результат, который вы упомянули.
let str = '[{"id":"2","status":"Passed"},{"id":"5","status":"Passed"},{"id":"7","status":"Passed"},{"id":"2","status":"Passed"},{"id":"9","status":"Passed"},{"id":"0","status":"Passed"},{"id":"10","status":"Passed"},{"id":"4","status":"Passed"},{"id":"8","status":"Passed"},{"id":"5","status":"Passed"},{"id":"7","status":"Passed"},{"id":"0","status":"Passed"},{"id":"1","status":"Passed"},{"id":"0","status":"Passed"},{"id":"1","status":"Passed"},{"id":"0","status":"Passed"},{"id":"11","status":"Passed"},{"id":"4","status":"Passed"},{"id":"2","status":"Passed"},{"id":"5","status":"Passed"},{"id":"2","status":"Passed"},{"id":"5","status":"Passed"},{"id":"2","status":"Passed"},{"id":"5","status":"Failed"}]';
let data = JSON.parse(str);
let map = new Map();
data.forEach(entry => {
let exist = map.get(Number(entry.id));
if(!exist) {
map.set(Number(entry.id), new PassFailCounter(Number(entry.id)));
exist = map.get(Number(entry.id));
}
entry.status == "Passed" ? exist.addPass() : exist.addFail()
});
console.log(JSON.stringify(Array.from(map.values())));
Возможно, не самое короткое решение, но оно работает.
Edit: вместо
JSON.stringify(Array.from(map.values()))
вы также можете сделать
JSON.stringify(Array.from(map.values()), function(key, value) {
if(isNaN(value)) {
return value;
}
return value.toString();
})
, если тип String важен на выходе.