D3.js中對array的使用

weixin_30639719發表於2020-04-05

由於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。

 

參考:d3.js in action

轉載於:https://www.cnblogs.com/shuaiwang/p/4607600.html

相關文章