【问题标题】:d3.js filter nodes based on dynamic data taken from json filed3.js 根据从 json 文件中获取的动态数据过滤节点
【发布时间】:2016-11-16 08:51:08
【问题描述】:

我已显示/隐藏我的力布局图的链接/节点。 但是我想从文件中动态读取我的类别列表,我不想对它们进行硬编码。所以我已经有了这个:

function createFilter()
    {

        d3.select(".filterContainer").selectAll("div")
            .data(["category1", "category2", "category3"])
            .enter()
            .append("div")
            .attr("class", "checkbox-container")
            .append("label")
            .each(function(d) {
                // create checkbox for each data
                d3.select(this)
                    .append("input")
                    .attr("type", "checkbox")
                    .attr("id", function(d) {return "chk_" + d;})
                    .attr("checked", true)
                    .on("click", function(d, i) {
                        // register on click event
                        var lVisibility = this.checked? "visible":"hidden";
                        filterGraph(d, lVisibility);
                    })
                d3.select(this).append("span")
                    .text(function(d){return d;});
            });

    }

如何更改数据以从我的 CategList 中读取类别,其中包含一个对象数组,每个对象包含例如:

{
    "nodes": [
        {"country": "US", "name": "saint peter's"},
        {"country": "Brazil", "name": "saint joseph's"}        
        ...
    ],
    "links": [ ... ],
    "CategList": [
                {
                    "categ": "category1",
                    "id": "US"
                },
                {
                    "categ": "category2",
                    "id": "BR"
                },
                {
                    "categ": "category3",
                    "id": "DE"
                },
            ]   
}

如何遍历所有对象并提取 "categ" 并将其传递给 d3 的 .data

更新:

如何将其传递到多选器的下拉菜单中,而不是将其作为复选框传递到".filterContainer"?:

<div class="checkbox new-check check-primary">
    <input type="checkbox"  id="type_filter" />
    <label for="type_filter">Types</label>
    <br>
</div>
<select class="selectpicker" id="type_multiselector" multiple>
    <option>category1</option>
    <option>category2</option>
    <option>category3</option>
</select>

【问题讨论】:

    标签: javascript json d3.js


    【解决方案1】:

    只需映射您的数据以创建一个仅包含类别的新变量,然后将其传递给 d3。

    类似这样的:

    const json = {
      "nodes": [
        {"country": "US", "name": "saint peter's"},
        {"country": "Brazil", "name": "saint joseph's"}        
      ],
      "links": [  ],
      "CategList": [
            {
              "categ": "category1",
              "id": "US"
            },
            {
              "categ": "category2",
              "id": "BR"
            },
            {
              "categ": "category3",
              "id": "DE"
            },
          ]   
    }
    
    const myData = json.CategList.map(o => o.categ)
    
    function createFilter()
    {
    
        d3.select(".filterContainer").selectAll("div")
            .data(myData)
            .enter()
            .append("div")
            .attr("class", "checkbox-container")
            .append("label")
            .each(function(d) {
                // create checkbox for each data
                d3.select(this)
                    .append("input")
                    .attr("type", "checkbox")
                    .attr("id", function(d) {return "chk_" + d;})
                    .attr("checked", true)
                    .on("click", function(d, i) {
                        // register on click event
                        var lVisibility = this.checked? "visible":"hidden";
                        filterGraph(d, lVisibility);
                    })
                d3.select(this).append("span")
                    .text(function(d){return d;});
            });
    
    }
    

    回应您的评论:不确定完全是我的想法,但类似:

    function createFilter()
    {
    
        d3.select(".filterContainer").selectAll("div")
            .data(myData)
            .enter()
            .append("div")
            .attr("class", "select-wrapper")
            .append("select")
            .each(function(d) {
                // create select option for each data
                d3.select(this)
                    .append("option")
                    .attr("id", function(d) {return "chk_" + d;})
                    .text(function(d){return d;});
            });
    
    }
    

    【讨论】:

    • 是否可以根据我发布的问题的更新来更新您的答案?既然你回答了这个问题,我想你也很容易找到更新的解决方案。无论如何,我已经接受了您的回答,因为它回答了主要部分。提前致谢
    • 我不确定,但我已经更新了我的答案给你一些想法。
    • 你知道为什么 phpstorm 会抛出 const myData = TypesTab.map(o =&gt; o.type); 的语法错误,以防 =&gt; 预期表达式,以及 ); 预期换行符或分号的情况。你知道为什么吗?
    • 我不确定,抱歉。
    猜你喜欢
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2020-08-29
    • 2014-07-01
    • 2021-03-28
    • 1970-01-01
    相关资源
    最近更新 更多