You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dc.js使用Reductio统计唯一project_id触发栈溢出错误求助

解决Reductio统计教师唯一项目数时的栈溢出问题

我来帮你排查下这个问题哈,你遇到的Maximum call stack size exceeded错误和代码里的几个细节有关,咱们一步步来解决:

错误根源分析

你触发的栈溢出,本质是调用teachersGroup.top(Infinity)时的递归排序导致的。dc.js的top()方法会对所有分组做排序操作,当你的数据里教师分组数量特别多的时候,排序算法(quicksort)的递归深度会超过浏览器的调用栈上限,直接触发报错。

另外,你代码里创建的projectDimension完全没用到,属于冗余代码,可以删掉简化逻辑。

修正方案

针对你的需求(统计每个教师对应的唯一project_id数量),咱们调整两个关键点:

  1. 移除无用维度:删掉没用到的projectDimension,只保留按教师分组的维度即可。
  2. 替换数据获取方式:用all()替代top(Infinity)获取所有分组数据——all()返回的是未排序的分组数组,不会触发排序操作,自然就避免了栈溢出。
  3. 确认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 10:08:13