【发布时间】:2012-08-02 16:18:09
【问题描述】:
使用 D3 2.4.2,我创建了许多路径元素,如下所示:
for (var i = 0; i < pathIndices.length; i++) {
graph.append("svg:path")
.style("stroke", colors[pathIndices[i]])
.style("stroke-width", "2.5px")
.style("fill", "none")
.attr("class", PATH_CLASS)
.attr("id", PATH_ID_PREFIX + pathIndices[i])
.attr("d", lineFunc(data))[0];
}
它们都按预期绘制到屏幕上。稍后,当用户进行一些输入时,我想将其中一个放在前面,所以我有一个事件处理程序来执行此操作:
var pathToHighlight = selectPath(pathIndex);
var paths = d3.selectAll("." + PATH_CLASS);
paths.sort(
function(a, b) {
if (a === pathToHighlight) {
return -1;
}
else if (b === pathToHighlight) {
return 1;
}
else {
return 0;
}
}
);
在 Chrome 中设置断点表明我这里的路径选择是成功的(paths 是一个 SVGPathElements 的数组)。但是代码什么也不做,并且在 sort 函数中设置断点表明 a 和 b 始终未定义。进入 d3 代码,我看到当内部函数 d3_selection_sortComparator 使用适当的参数调用我的比较器时,除了它们与自己的未定义 __data__ 成员进行与运算,这会导致 undefined 被传入:
// a and b are correct, but a.__data__ and b.__data__ are undefined
return comparator(a && a.__data__, b && b.__data__);
我在这里做错了什么?我的路径正确地绘制到屏幕上,所以看起来它们应该有正确的数据。对吧?
编辑:图片:
【问题讨论】:
-
那么,
paths是一个原生数组,不包含undefined项? -
它看起来像 Chrome 调试器中的原生数组。没有未定义的项目,只有预期的 svg 路径元素。
-
Afaik 许多对象在调试器中看起来像数组。检查其原型链,并测试
paths.sort === [].sort -
console.log(typeof paths);给了我object。公平地说,console.log(typeof []);也是如此。 D3 文档说它希望从它的 selectAll() 中返回一个“选择”。你的paths.sort === [].sort给了我错误的信息。
标签: javascript svg d3.js