JavaScript统计数组对象中来源与告警组合的出现频次
统计JavaScript数组中来源对应告警的出现次数
嘿,这个需求很常见!我们可以用JavaScript的reduce方法来快速实现,它能帮我们遍历数组的同时,一步步构建出带frequency字段的结构化结果。
先把你的原始数组放出来方便参考:
var array = [ {name: "Source_one", alertName: "Alert_1"}, {name: "Source_three", alertName: "Alert_2"}, {name: "Source_one", alertName: "Alert_3"}, {name: "Source_two", alertName: "Alert_3"}, {name: "Source_one", alertName: "Alert_3"}, {name: "Source_one", alertName: "Alert_3"}, {name: "Source_two", alertName: "Alert_1"}, {name: "Source_one", alertName: "Alert_1"}, {name: "Source_two", alertName: "Alert_1"}, {name: "Source_two", alertName: "Alert_2"}, {name: "Source_one", alertName: "Alert_1"}, {name: "Source_two", alertName: "Alert_2"}, {name: "Source_three", alertName: "Alert_3"}, {name: "Source_two", alertName: "Alert_2"}, {name: "Source_two", alertName: "Alert_3"}, {name: "Source_three", alertName: "Alert_1"}, {name: "Source_three", alertName: "Alert_1"}, {name: "Source_one", alertName: "Alert_3"}, {name: "Source_three", alertName: "Alert_2"}, {name: "Source_three", alertName: "Alert_2"}, {name: "Source_two", alertName: "Alert_1"}, {name: "Source_three", alertName: "Alert_3"} ];
下面是具体的实现代码:
const result = array.reduce((acc, current) => { // 先检查当前来源是否已经在累加器中存在 const sourceEntry = acc.find(item => item.name === current.name); if (sourceEntry) { // 检查当前告警是否属于该来源的已统计告警 const alertEntry = sourceEntry.alerts.find(alert => alert.alertName === current.alertName); if (alertEntry) { // 已存在则频次+1 alertEntry.frequency++; } else { // 不存在则新增告警条目,初始频次为1 sourceEntry.alerts.push({ alertName: current.alertName, frequency: 1 }); } } else { // 来源不存在则新增来源条目,同时添加第一个告警记录 acc.push({ name: current.name, alerts: [{ alertName: current.alertName, frequency: 1 }] }); } return acc; }, []); console.log(result);
逻辑说明
- 用
reduce初始化一个空数组作为累加器acc,用来存储最终的结构化结果 - 遍历数组每一项时,分三步处理:
- 校验当前来源是否已被记录
- 若来源已存在,再校验对应告警是否已统计
- 存在则频次递增,不存在则新增记录;来源未存在则直接创建新的来源+告警组合
最终输出的结构化结果示例:
[ { "name": "Source_one", "alerts": [ { "alertName": "Alert_1", "frequency": 3 }, { "alertName": "Alert_3", "frequency": 4 } ] }, { "name": "Source_three", "alerts": [ { "alertName": "Alert_2", "frequency": 3 }, { "alertName": "Alert_3", "frequency": 2 }, { "alertName": "Alert_1", "frequency": 2 } ] }, { "name": "Source_two", "alerts": [ { "alertName": "Alert_3", "frequency": 2 }, { "alertName": "Alert_1", "frequency": 3 }, { "alertName": "Alert_2", "frequency": 3 } ] } ]
内容的提问来源于stack exchange,提问作者SamK
相关产品推荐
相关产品推荐

