簡體   English   中英

當我將整個數據數組用作域時,為什么 d3.domain() 只有一個元素?

[英]Why d3.domain() has only one element when I use the whole data array as domain?

在使用d3.histogrambins之前,我做了一些更復雜的事情,但是在以下情況下,我不確定為什么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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM