【问题标题】:How to compare a property to the values from an array of object?如何将属性与对象数组中的值进行比较?
【发布时间】:2018-09-28 07:47:32
【问题描述】:

d{"children":[{"name":"China","children":[{"name":"China","value":400,"percentage":"33.33"}],"index":0},{"name":"England","children":[{"name":"England","value":300,"percentage":"33.33"}],"index":1},{"name":"Malaysia","children":[{"name":"Malaysia","value":500,"percentage":"25.00"}],"index":2},{"name":"South Korea","children":[{"name":"South Korea","value":600,"percentage":"50.00"}],"index":3}]}

对象数组

cfg.thresholdSetting.thresholds = [{"dType":"threshold","from":0,"to":30,"color":"rgb(217, 20 ,39)"},{"dType":"threshold","from":30,"to":70,"color":"rgb(242, 145, 10)"},{"dType":"threshold","from":70,"to":120,"color":"rgb(33, 145, 49)"}]

然后我有一个属性:

rect.style("fill", function (d, i) {

    for (var k = 0; k < fromValues.length; k++) {
      console.log("percentage : " + d.percentage)
      console.log("from value : " + fromValues[k])
      console.log("to value : " + toValues[k])
         if (d.percentage >= fromValues[k] && d.percentage <= toValues[k]) {
           return cfg.thresholdSetting.thresholds[k].color;
         }
         else {
           return "#808080";
         } 
    }
  })

从代码中,我的 from 和 to 值输出停滞不前。外部循环根据我拥有的数据数量运行。我如何比较这些值?

电流输出

预期输出

d.percentage = 33.33
from value   = 0
to value     = 30

d.percentage = 33.33
from value   = 30
to value     = 70

d.percentage = 33.33
from value   = 70
to value     = 120 

d.percentage = 50.00
from value   = 0
to value     = 30

d.percentage = 50.00
from value   = 30
to value     = 70

d.percentage = 50.00
from value   = 70
to value     = 120

【问题讨论】:

  • d 来自哪里?为什么在第一次迭代中退出循环?
  • d 是我的数据的迭代器,这意味着它会根据我拥有的数据数量循环,你是什么意思退出?我不明白?返回一个值退出循环是吗?那么如何在循环中返回一个值呢? @NinaScholz
  • 是的,return 不仅退出循环,还退出整个函数。
  • 好的,那么我该怎么做才能获得预期的输出?
  • 仍然没有d

标签: javascript arrays for-loop d3.js


【解决方案1】:

根据您的示例,我假设您使用的是 d3,并且您想根据它们所在的 bin 设置矩形的颜色。我还假设"#808080" 是当数据与任何 bin 都不匹配时的默认颜色。在这种情况下:

rect.style("fill", function(d) {
    var color = cfg.thresholdSetting.thresholds.filter(function(t, i) {
        return d.percentage >= t.from && d.percentage < t.to;
    });
    return color.length > 0 ? color[0].color : "#808080";
});

【讨论】:

  • 颜色应该是thresholdSetting.thresholds.color。
  • 您获得超过 1 条范围记录的可能性有多大?
  • 不可能,这就是为什么我将带有开放边界的值与t.to进行比较。取决于默认值是什么:如果它应该是对应于最低可能范围的颜色,它应该是d.percentage &gt; t.from &amp;&amp; d.percentage &lt;= t.to,否则我的答案中的那个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 2018-02-06
  • 2019-04-06
相关资源
最近更新 更多