2012-08-03 74 views
2

我使用D3與JSON數據與類似下面的函數從JSON的最高值:獲得在D3

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大於1比12,但我不知道如何解決這個問題。謝謝!

回答

6

根據API參考,d3.max使用返回最大值自然順序。由於您正在計算字符串數組的最大值,因此使用lexicographic (alphabetical) order。比較:

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

如果要計算一個數組的最大數字,你應該這些字符串先轉換爲數字。這樣做的一個簡便的方法是一元+操作:

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

如果你願意,你也可以使用parseFloat,parseInt函數,數字或其他各種方法強迫字符串到數字。從技術上講,您可以將其作爲d3.max調用(d3.max(data, Number))的一部分來執行此操作,但明確執行強制操作通常更快更安全。

當然,既然你已經使用JSON和JSON是一種類型化的序列化格式,它也可能會更有意義存儲在JSON數字,而不是字符串;那麼你將不需要任何類型的強制。

+0

謝謝Mike。這是一個非常有用的答案。感謝您創建D3 - 我剛開始學習它,我很喜歡它。 – 2012-08-03 23:17:26