如何遍历三级嵌套数组统计Passed/Failed状态数量?支持多JS方案
统计嵌套数组中Passed/Failed状态的数量
我来帮你搞定这个统计需求!针对你的三级嵌套数组,我给你准备了几种不同的实现方案,你可以根据自己的技术栈和习惯选择:
原生JavaScript方案
这个方案不需要额外依赖,用原生数组方法就能轻松实现,思路是先把多层嵌套数组“拍平”成一维数组,再过滤出包含result字段的对象,最后统计对应状态的数量:
function addData(data) { var postotal = data.posreports.length; $('#posTotal').append(postotal); let posreports = data.posreports; // 统计逻辑开始 // 把所有层级的嵌套数组拍平成一维数组 const flattened = posreports.flat(Infinity); // 初始化统计对象,遍历数组统计数量 const statusCount = flattened.reduce((acc, item) => { // 只处理带有result字段的对象,跳过空对象 if (item.result) { acc[item.result] = (acc[item.result] || 0) + 1; } return acc; }, { Passed: 0, Failed: 0 }); console.log("状态统计结果:", statusCount); // 这里可以把结果渲染到UI上,比如: // $('#passedCount').text(statusCount.Passed); // $('#failedCount').text(statusCount.Failed); }
- 代码说明:
flat(Infinity)会自动处理所有层级的嵌套数组,不管你是三级还是更多级;reduce方法用来遍历数组,遇到带有result字段的对象时,对应状态的计数就加1,空对象会被自动跳过。
Ramda.js方案
如果已经引入了Ramda.js,函数式风格的写法会更简洁优雅,非常适合处理这种嵌套数据的场景:
function addData(data) { var postotal = data.posreports.length; $('#posTotal').append(postotal); let posreports = data.posreports; // 统计逻辑开始 const statusCount = R.pipe( R.flatten, // 拍平所有层级的嵌套数组 R.filter(R.has('result')), // 过滤出包含result字段的对象 R.countBy(R.prop('result')) // 按result字段的值分组统计数量 )(posreports); // 确保没有数据的状态默认显示0,避免出现undefined const finalCount = R.merge({ Passed: 0, Failed: 0 }, statusCount); console.log("状态统计结果:", finalCount); // 渲染到UI的示例代码: // $('#passedCount').text(finalCount.Passed); // $('#failedCount').text(finalCount.Failed); }
- 代码说明:Ramda的
pipe方法会把多个函数串联起来,前一个函数的输出作为后一个的输入;R.has('result')用来判断对象是否包含result字段,R.countBy(R.prop('result'))会自动按result的值分组计数;最后用R.merge补充默认值,保证即使某个状态没有数据,也会显示0而不是undefined。
验证示例数据
用你提供的示例数组测试,两种方案都会得到相同的结果:
{ Passed: 7, Failed: 5 }
内容的提问来源于stack exchange,提问作者Mark White
相关产品推荐
相关产品推荐

