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

D3.js中if else设置矩形填充色失效,如何修正?

问题描述

我正在使用以下代码计算数值:

let sizeBands = data.map(({size, count}) => size / count);
sizeBands.forEach(function(colorBand){
  if (colorBand < 60) {
    console.log(colorBand + " Under 60!")
  }
  if (colorBand >= 60) console.log(colorBand + " Over 60!")
})

这段代码输出正常,能显示正确数值。但当我尝试给D3的rect元素根据这些数值设置填充色时,所有矩形都显示绿色:

.attr('fill', function(d) {
  if (d.colorBand <= 55) {
    return "red";
  } else if (d.colorBand >= 56 && d.colorBand <= 60) {
    return "blue";
  } else {
    return "green"
  }
});

请问如何让代码为矩形设置正确的填充色?


解决方案

问题出在你计算的sizeBands数组和绑定到DOM元素的原始数据没有关联。你现在只是单独生成了一个存储计算值的数组,但D3回调里的d仍然是原始data中的对象,这些对象并没有colorBand属性——所以d.colorBand实际上是undefined,在比较时会被视为NaN,自然会进入最后一个else分支返回绿色。

解决方法很简单,直接把计算后的colorBand值添加到原始数据的每个对象中:

// 替换原来的sizeBands计算代码
data.forEach(d => {
  d.colorBand = d.size / d.count;
});

// 现在可以正常验证数值(可选)
data.forEach(function(d){
  if (d.colorBand < 60) {
    console.log(d.colorBand + " Under 60!")
  } else {
    console.log(d.colorBand + " Over 60!")
  }
})

这样,当你在D3的attr('fill')回调中访问d.colorBand时,就能获取到正确的计算值,填充色的判断逻辑也就可以正常工作了。

另外可以小优化一下你的条件判断,让它更简洁:

.attr('fill', function(d) {
  if (d.colorBand <= 55) return "red";
  if (d.colorBand <= 60) return "blue";
  return "green";
});

因为第一个条件已经过滤了<=55的情况,第二个条件只需要判断<=60就可以覆盖56-60的区间,逻辑和原来一致但更清晰。


内容的提问来源于stack exchange,提问作者Jon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:37:31