dc.js使用Reductio统计唯一project_id触发栈溢出错误求助
解决Reductio统计教师唯一项目数时的栈溢出问题
我来帮你排查下这个问题哈,你遇到的Maximum call stack size exceeded错误和代码里的几个细节有关,咱们一步步来解决:
错误根源分析
你触发的栈溢出,本质是调用teachersGroup.top(Infinity)时的递归排序导致的。dc.js的top()方法会对所有分组做排序操作,当你的数据里教师分组数量特别多的时候,排序算法(quicksort)的递归深度会超过浏览器的调用栈上限,直接触发报错。
另外,你代码里创建的projectDimension完全没用到,属于冗余代码,可以删掉简化逻辑。
修正方案
针对你的需求(统计每个教师对应的唯一project_id数量),咱们调整两个关键点:
- 移除无用维度:删掉没用到的
projectDimension,只保留按教师分组的维度即可。 - 替换数据获取方式:用
all()替代top(Infinity)获取所有分组数据——all()返回的是未排序的分组数组,不会触发排序操作,自然就避免了栈溢出。 - 确认Reductio逻辑:你用
exception()+exceptionCount(true)来统计唯一项目数的思路是对的,只需要确保正确将reducer应用到分组上。
修正后的完整代码
const myChart = dc.numberDisplay(divRef); // 仅保留教师维度,按教师分组 const teacherDimension = ndx.dimension(function (d) { return d.teachers; }); const teacherGroup = teacherDimension.group(); // 配置Reductio reducer,统计每个教师的唯一project_id数量 const reducer = reductio() .exception(function(d) { return d.project_id; }) .exceptionCount(true); // 将reducer绑定到分组上 reducer(teacherGroup); // 用all()获取所有分组数据,避免排序导致的栈溢出 console.log(teacherGroup.all());
额外小提示
如果之后你确实需要排序后的结果,可以手动对all()返回的数组做排序,用非递归的排序逻辑或者分批次处理,比如:
// 按唯一项目数从多到少排序 const sortedTeacherGroups = teacherGroup.all().sort((a, b) => b.value.exceptionCount - a.value.exceptionCount); console.log(sortedTeacherGroups);
内容的提问来源于stack exchange,提问作者Gilbert Mizrahi
相关产品推荐
相关产品推荐

