d3.js - D3.js v6.2 - 在监听函数中获取数据索引 - selection.on('click', listener)
问题描述
在以前的版本中,可以通过以下方式检索索引i
:
selection.on("click", function(d,i){...}
但是,这在最新版本中似乎不再起作用,因为第一个参数始终是事件对象。如何在侦听器函数中获取数据的索引?
let data = [2,5,8,9]
d3.select("body").selectAll("p")
.data(data)
.enter()
.append("p")
.text(d=>d)
.on("mouseover", function(e,d,i){
//console.log(e); --> event
console.log(d);
console.log(i);
// i should be the index of the hovered element
})
<script src="https://d3js.org/d3.v6.min.js"></script>
当在选定元素上调度指定事件时,将为该元素评估指定的侦听器,并传递当前事件 (event) 和当前数据 (d),并将 this 作为当前 DOM 元素 (event.currentTarget)。
官方文档:https ://github.com/d3/d3-selection/blob/v2.0.0/README.md#selection_on
解决方案
d3-selection 2.0 中新功能的 Observable笔记本建议使用局部变量来保留索引:
侦听器不再传递所选元素的索引 ( i ) 或同级元素 ( nodes )。这些很少使用,如果重新选择元素会产生混乱的行为,并且可能导致内存泄漏。如果您需要它们,请将它们烘焙到元素的数据中,或者改用局部变量。
这可以通过以下方式轻松完成:
let data = [2,5,8,9]
const index = d3.local(); // Local variable for storing the index.
d3.select("body").selectAll("p")
.data(data)
.enter()
.append("p")
.text(d=>d)
.each(function(d, i) {
index.set(this, i); // Store index in local variable.
})
.on("mouseover", function(e,d,i){
console.log(d);
console.log(index.get(this)); // Get index from local variable.
});
<script src="https://d3js.org/d3.v6.min.js"></script>
请注意,尽管为清楚起见,上面的示例使用单独的调用来完成,但为了简洁和性能,.each()
这也可以在现有调用中完成。.text()
推荐阅读
- java - 为什么HashMap(JDK1.8)中hash的计算不需要像ConcurrentHashMap那样考虑负hashCode?
- shopware - Shopware 在会话超时时清除购物车并重定向到注册页面
- angular - 正确使用 Angular 6 ReplaySubject 进行缓存 - 观察者长度不断增长
- javascript - Javascript 根据特定列属性将数组重塑为新数组
- c++ - 哪个函数与 Mac OS X 上的“pthread_rwlock_timedrdlock()”和“pthread_rwlock_timedwrlock()”等价?
- java - 如何将可变参数传递给观察者?
- java - 从 Docker 在 MacOS 上运行 IDE
- r - 闪亮:覆盖rhandsontable,赋值左侧无效(NULL)
- laravel - 从所需的 laravel 验证中排除禁用的字段
- c++ - 在实现文件中声明带有模板参数的方法