2

我将 D3 与 JSON 数据一起使用,其功能类似于:

 d3.json("http://api.json", function(jsondata) {
 var data = jsondata.map(function(d) { return d.number; });

这导致数据相等["2", "5", "8", "12"]

然后,如果我使用: var x = d3.scale.linear() .domain([0, d3.max(data)])

返回的最大值是 8 而不是 12。我意识到这是因为 8 大于 12 中的 1,但我不知道如何解决这个问题。谢谢!

4

1 回答 1

6

根据 API 参考,d3.max使用natural order返回最大值。由于您正在计算字符串数组的最大值,因此使用字典(字母)顺序。比较:

console.log("8" > "12"); // true
console.log(8 > 12); // false

如果要计算数组的最大数值,您可能应该首先将这些字符串转换为数字。一种方便的方法是一元运算+符:

var data = jsondata.map(function(d) { return +d.number; });

如果您愿意,还可以使用 parseFloat、parseInt、Number 或各种其他方法将字符串强制转换为数字。从技术上讲,您可以将其作为 d3.max 调用 ( d3.max(data, Number)) 的一部分来执行,但是显式执行强制转换通常更快更安全。

当然,由于您已经在使用 JSON 并且 JSON 是一种类型化的序列化格式,因此将数字存储在 JSON 中而不是字符串中也可能更有意义;那么您将不需要任何类型强制。

于 2012-08-03T23:11:04.800 回答