如何通过使用选择将D3选区划分为组.循环中的过滤器方法
How to divide a D3 selection into groups by using the selection.filter method in a loop
这是我在这里的第一个帖子,如果看起来有点笨拙,我很抱歉。
我正在使用D3.js的力有向图上工作。我遇到了过滤器功能的问题。这是我的情况:我在我的图中创建了节点,这些节点有很多特征。我希望首先能够创建所有这些节点的子集,基于用户认为可能是相关的功能,并进行可视化分析。
例如,我正在处理玫瑰图像(这是我的节点),我想根据它们的圆度对它们进行过滤。圆度特征可以从0到1000,所以我首先尝试制作5个子集。第一个节点的圆度从0到200,第二个节点的圆度从200到400,等等……直到最后一个子集,从800到1000。
为了得到子集,我使用d3.js的过滤函数。这就是我遇到问题的地方:
注意:- var "nodes"是我的节点集合,它们都存在。- var"groups =[]"将包含我的五个节点子集。—var"thresholds =[]"包含了我设置的所有阈值。示例:threshold[0] == 0, threshold[1] == 200, threshold[2] == 400.
for(i = 0 ; i < 5 ; i++) //going through the creation of 5 subsets
{
groups[i] = nodes.filter(function(d, i)
{
return d.Shape_Roundness > thresholds[i] && d.Shape_Roundness <= thresholds[i + 1];
//Get the nodes "d" which have a roundness superior to a minimum threshold and inferior to a maximum threshold
});
}
当我检查子集的输出时,只有一个结果,就好像函数在碰到"return"关键字时中断了。更重要的是,结果在每个子集中总是相同的,并且是整个集合的第一个节点。
但是当我输入硬输入时,通过用数字0和200替换例如"阈值[I]"answers"阈值[I + 1]",像这样:
for(i = 0 ; i < 5 ; i++) //going through the creation of 5 subsets
{
groups[i] = nodes.filter(function(d, i)
{
return d.Shape_Roundness > 0 && d.Shape_Roundness <= 200;
});
}
现在,我不知道为什么,但它工作,我当然有5个相同的子集。我想也许我的变量"阈值=[]"不包含数字,但是当我对每个值使用typeof运算符时,输出是"数字"。
我想使用变量而不是硬值,因为我希望用户可以更改阈值。当然不是所有节点的特征都从0到1000
谁能告诉我我做错了什么?
非常感谢。祝大家度过美好的一天!
问题是,您使用变量i
作为for循环的循环变量和过滤器部分中匿名函数的参数。
在匿名函数中,只有参数i
可以访问,并且循环变量是不可见的,因为它具有相同的名称。这被称为变量遮蔽。
正如D3的文档在这里解释的那样,给filter
函数回调的第二个参数是节点的索引。因此,在回调中,您访问nodes
的第一个节点的thresholds[0]
,访问第二个节点的thresholds[1]
,以此类推。
由于您不需要过滤器当前节点的索引,最简单的修复方法是省略i
参数,如下所示:
for(i = 0 ; i < 5 ; i++) { //going through the creation of 5 subsets
groups[i] = nodes.filter(function(d) {
return d.Shape_Roundness > thresholds[i] && d.Shape_Roundness <= thresholds[i + 1];
//Get the nodes "d" which have a roundness superior to a minimum threshold and inferior to a maximum threshold
});
}
这样,回调函数中的i
变量将引用你的循环变量。
- Array方法中的Javascript循环
- 如何在循环中使用jQuery.on()方法,而不覆盖我循环的对象
- 有没有一种方法可以在所有嵌套循环之后放置一个标签,以便在一步中将它们全部打断
- 特定循环(html元素)方法的优点和缺点
- MeteorJS使用流星调用和流星方法时的无限循环
- 使用click()方法是在创建一个无休止的循环
- 在 1 个方法中增加变量值会触发另一个方法的 for 循环,欢迎任何建议
- 循环遍历 DOM 元素时,是否有 for 循环的替代方法
- 在二维数组中搜索比嵌套循环更有效的方法
- 在Raphael JS中创建脉动(循环)背景的最简单方法
- 有没有任何方法可以使这个名称生成循环运行最短的秒数
- 对于许多类似的方法,使用for循环
- 可以't在对象数组上循环时调用公共方法
- Node.js:如何在一个循环中使用回调调用方法
- 在循环中创建函数的最有效替代方法
- JavaScript 将循环遍历数组的函数传递给使用 Switch 语句日期方法的函数
- RequireJS,循环依赖和导出“魔术”方法
- 每次迭代在 Foreach 循环中重复 PHP 睡眠方法
- 在nodejs中使用Q.js承诺进行循环的正确方法
- 在c#中创建一个自循环方法