在d3

时间:2016-03-11 13:17:03

标签: javascript d3.js

我正在使用d3中的散点图。图上的点代表不同的论文。有3种不同的类型这些点中的每一个都可以具有1)In_library 2)引用的3)引用。这些类型都设置在与数据库建立的各种连接上,并设置为已检索的数据,然后将此数据推送到 allData 。例如。在点击 In_library 类型的纸张时,将2个连接到数据库,检索被点击的纸张引用的纸张和引用所点击的纸张的纸张。发生这种情况时,会调用refreshGraph函数,该函数会清除所有当前点并使用更新的数据重绘点。

我的问题是,当我点击画布上的任何地方(除了图表上的点之外的任何地方)我希望删除引用和引用的类型的点。

我脑海中想象的是,循环应该遍历用于绘制点的数据,当遇到类型为引用的数据时引用它应该从数据中删除它们。然后应该调用refreshGraph,重绘图形将不包括我删除的元素。

以下是我在点击画布时的尝试:

var svg = d3.select("body")
.append("svg")
.on("click", function() {

    for(i=0;i<allData.length;i++){ 
        if (i.type == "cites"|| i.type == "cited by")
     {
        allData.splice(i, 1);
      }
    }
    refreshGraph();
    })

但这显然是错误的,因为它似乎根本没有做任何事情。我非常感谢任何反馈,因为我是d3的新手!提前谢谢!

编辑:

通过将循环更改为:

解决了此问题
for(var i = allData.length-1; i >=0; i--){ 

        if (allData[i].type === "cites"|| allData[i].type === "cited by")
     {
        allData.splice(i, 1);
      } 

    }

1 个答案:

答案 0 :(得分:0)

为什么你有else{ return}。这意味着如果allData中的某个条目没有引用或引用,则refresGraph()将永远不会被调用。

将代码更改为

var svg = d3.select("body")
.append("svg")
.on("click", function() {

    for(i=0;i<allData.length;i++){ 
        if (i.type == "cites"|| i.type == "cited by"){
        allData.splice(i--, 1);
      }
    refreshGraph();
     })

我应该做的伎俩