如何简便统计动态对象中isSelected=true的属性数量?
统计嵌套对象中isSelected为true的数量的简便方法
由于你的对象是动态嵌套结构(键名如MainData1、Child1不固定),手动嵌套forEach会很繁琐且不灵活。以下几种方法更简洁且能适配任意层级的动态结构:
方法1:递归+Reduce
利用递归遍历所有嵌套对象/数组,结合reduce累加计数:
const data = { "MainData1": [ { "Child1": [ { "value": "item1", "isSelected": true }, { "value": "item2", "isSelected": true } ] } ], "MainData2": [ { "Child2": [ { "value": "item", "isSelected": true } ] } ] }; const countSelected = (obj) => Object.values(obj).reduce((total, val) => { // 递归处理嵌套对象/数组 if (typeof val === 'object' && val !== null) { total += countSelected(val); } // 当前对象isSelected为true则加1 return total + (obj.isSelected ? 1 : 0); }, 0); console.log(countSelected(data)); // 输出:3
方法2:迭代栈遍历(非递归)
如果担心递归深度问题,可以用栈实现迭代式遍历:
function countSelected(obj) { let count = 0; const stack = [obj]; while (stack.length > 0) { const current = stack.pop(); // 检查当前对象的isSelected属性 if (current.isSelected) count++; // 将所有嵌套的对象/数组推入栈中 Object.values(current).forEach(val => { if (typeof val === 'object' && val !== null) stack.push(val); }); } return count; } console.log(countSelected(data)); // 输出:3
这两种方法都无需硬编码任何动态键名,自动适配所有嵌套层级,比手动写多层forEach更简洁健壮。
内容的提问来源于stack exchange,提问作者arj
相关产品推荐
相关产品推荐

