由於D3類庫和array密切相關,我們有必要討論一下D3中的資料繫結以及在陣列內部運算的方法。
1.D3中的陣列
和其他程式語言一樣,D3的陣列元素可以是數字或者字元等型別,例如:
someData=[20,36,48,59,600,88];
此外,考慮json資料在網路傳輸中的便利性,D3陣列也支援將json物件,如:
someBook=[{name:"book1", price: 50}, {name:"book2", price: 150}, {name:"book3", price: 350}];
2.D3中的陣列過濾功能
array有一個filter()方法,這個方法的返回值是array中滿足自定義需求的資料陣列。例如:
someNumer.filter(function(sn) {return sn >= 40});
這條語句中使用了someNumber這個array的filter方法,它使用了一個function,此function中將someNumber中的每一個元素(命名為sn)進行遍歷,如果滿足自定義條件(大於等於40),則將此元素拷貝至一個新建的陣列中,最後的返回值便是這個陣列。
3.繫結,enter()和exit()
D3使用data()方法將陣列和選擇的CSS元素進行繫結;
enter()方法定義了當陣列元素超過已經繫結或者選擇的CSS元素的個數時,則生成新的CSS元素,使用新CSS元素與陣列中資料進行繫結;
exit()方法定義了當陣列元素超過已經繫結或者選擇的CSS元素的個數時,則拋棄多餘的陣列元素。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>test</title> <script type="text/javascript" src="d3.js"></script> </head> <style> #borderdiv { width: 200px; height: 50px; border: 1px solid gray; } </style> <body> <div id="borderdiv"> </div> </body> <script>var someNumbers = [17, 82, 9 ,500, 40]; var smallerNumers = someNumbers.filter(function(e1){return e1 <= 40 ? this : null}); d3.select("body").selectAll("div") .data(smallerNumers) .enter() .append("div") .html(function(sd) {return sd}) .style("font-weight", "900"); </script> </html>
上面的程式碼中,smallerNumber中將會含有17,9,40三個元素,但是隻有broderdiv這一個div,所以當執行上面的指令碼後,會為9和40新生成兩個div。如圖
當然,如果將上述程式碼中的enter()方法替換為exit(), 那麼9和40將被丟棄,不會生成新的div。