Javascript d3.js迭代订单更改
作为了解d3.js的项目,我正在地图上实时显示推文。到目前为止,一切都很顺利,我对图书馆非常非常满意 在页面上,我试图列出所有语言。在悬停状态下,我希望该语言的所有推文都能弹出。所有这些都完成了,除了列表中的一些项目会弹出另一种语言的tweet。一个错误的,我可能会补充 这就是我在地图上投射点的方式:Javascript d3.js迭代订单更改,javascript,d3.js,Javascript,D3.js,作为了解d3.js的项目,我正在地图上实时显示推文。到目前为止,一切都很顺利,我对图书馆非常非常满意 在页面上,我试图列出所有语言。在悬停状态下,我希望该语言的所有推文都能弹出。所有这些都完成了,除了列表中的一些项目会弹出另一种语言的tweet。一个错误的,我可能会补充 这就是我在地图上投射点的方式: points.selectAll('circle') .data(tweets) .enter() .append('circle') // Attach no
points.selectAll('circle')
.data(tweets)
.enter()
.append('circle')
// Attach node to tweet, so I can use refer to the nodes later
.each(function(d) {
d.node = this;
})
.attr('r', 1);
以下是我创建列表的方式:
var data = d3.nest()
// Group by language code
.key(function(d) { return d.lang.code; })
.entries(tweets)
// Sort list by amount of tweets in that language
.sort(function(a, b) {
return b.values.length - a.values.length;
});
var items = languages_dom
// Add items
.selectAll('li')
.data(data)
.enter()
.append('li');
// Used for debugging
.attr('data-lang', function(d) {
return d.key; // Group key = language code
})
// Set text
.text(function(d) {
var dt = d.values[0];
return dt.lang.name;
})
// Mouseover handler
.on('mouseover', function(d) {
// Compare attribute with
// These values are actually different
var attr = d3.select(this).attr('data-lang');
console.log(attr, d.key);
// Pop up each node
d.values.forEach(function(d) {
d = d3.select(d.node);
d.transition()
.duration(200)
.attr('opacity', 0.5)
.attr('r', 8);
});
});
请注意,上面的脚本运行了多次d.key
引用链中稍后的另一个值,而我不修改该链中的数据
编辑22:08
当我不整理数据时,事情似乎很顺利。至少这是一个潜在客户。如评论中所述,您正在覆盖forEach函数中的d。相反,你应该尝试以下方法
d.values.forEach(function(p) {
d3.select(p.node)
.transition()
.duration(200)
.attr('opacity', 0.5)
.attr('r', 8);
});
请注意,forEach变量的名称是p而不是d。随着数据的更改,旧数据似乎以某种方式保留了下来 无论哪种方式,我只是在应用新数据之前删除了列表:
languages_dom
.selectAll('li')
.remove();
不能说这是优雅的,也不能说是性能良好的,但它完成了任务:)看起来您正在覆盖此处的数据:
d=d3.select(d.node)代码>。谢谢您的回答。我试过了,但没用。事件处理程序中的console.log
仍然显示不一致的结果。