[英]Why d3.domain() has only one element when I use the whole data array as domain?
在使用d3.histogram
和bins
之前,我做了一些更復雜的事情,但是在以下情況下,我不確定為什么domain()
不會返回數組而只返回第一個元素? 我們不能使用數據數組和其中的每個元素作為域的“鍵”嗎?
const data = [ { name: "A", value: 1 }, { name: "B", value: 5 }, { name: "C", value: 7 }, { name: "D", value: 3 }, { name: "E", value: 9 }, ]; const scaleX = d3.scaleBand().domain(data).range([0, 1000]); console.log("scaleX.domain()", scaleX.domain()); console.log("scaleX.range()", scaleX.range());
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.6.2/d3.js" integrity="sha512-6G9G63qZLxEcLqVyklArI/2ZgWK1HdKMU9yWbQUJC/eSsLsaY0NZKv4JDW4ltw1Z9sEvFB3DP54GzOIkIJjyLg==" crossorigin="anonymous"></script>
當您將數組傳遞給domain()
方法時,您做對了......
.domain(data)
...但是,這還不夠:arrays 可以包含數字、字符串、函數、其他 arrays 等。帶(或序數)比例的問題是您不能將對象作為數組的單個元素。 我們可以通過查看源代碼來了解原因:
scale.domain = function(_) {
if (!arguments.length) return domain.slice();
domain = [], index = new Map();
for (const value of _) {
const key = value + "";
if (index.has(key)) continue;
index.set(key, domain.push(value));
}
return scale;
};
如果你看一下for (const value of _) { const key = value + "";
,它在內部為 JavaScript Map 生成唯一鍵,您會發現這根本不適用於對象:
const obj1 = {foo:42}; const obj2 = {bar:17}; console.log(obj1 + ""); console.log(obj2 + ""); console.log(obj1 + "" === obj2 + "");
上面片段中最重要的信息是最后一個console.log
中的true
信息:所有對象,即使不同,在生成 Map 的密鑰時,對於比例尺來說都是一樣的(記住,波段比例尺不能有重復的值) .
正因為如此,這里continue
...
if (index.has(key)) continue;
...總會發生,因此您的域實際上只有一個元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.