首页 > 解决方案 > 如何从阵列中获取个人 ID 和通过/失败的数量?

问题描述

这是我拥有的一组数据。我需要一个具有唯一 ID 和单个通过/失败状态数量的新数组。我正在使用角度 6。

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

//JavaScript code

我期待输出

[
{"id":"1", "Passed": "2", "Failed": "0"},
{"id":"2", "Passed": "5", "Failed": "0"}....and so on]

输出中应该有 10 个元素。

标签: javascriptjsonangular

解决方案


你可以试试这些方法。

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())));

也许不是最短的解决方案,但它有效。

编辑:而不是

JSON.stringify(Array.from(map.values()))

你也可以

JSON.stringify(Array.from(map.values()), function(key, value) {
    if(isNaN(value)) {
      return value;
    }
    return value.toString();
})

如果字符串类型对输出很重要。


推荐阅读