我正在使用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);
}
}
答案 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();
})
我应该做的伎俩