d3.js:有效过滤大型选择

时间:2014-06-27 12:59:24

标签: javascript d3.js

给定大量选择(数万)我想过滤一个或多个匹配给定ID的元素。

对于他们来说,我会使用类似的东西:

var ids = [1, 42, …, 13];
var idsObj = arrayToObject(ids); // { 1: 1, 42: 1, …, 13: 1 }

var filteredSelection = theSelection.filter(function(d) {
    return idsObj[d.id];
});

我不喜欢该解决方案的是运行时并不真正依赖于ID的数量。无论是否已找到所有ID,它都会遍历整个选择。

有没有办法手动迭代选择?我已经theSelection.each(),但似乎没有办法打破迭代。 或者你知道另一种方法吗?

修改 也许我可以使用类似的东西:

for (var i = 0; i < theSelection[0].length; i++) {
    // d3.select(theSelection[0][i]).datum().id
};

1 个答案:

答案 0 :(得分:0)

好的,我想我已经找到了解决方案。请评论,如果有更好的方法;)

var filteredNodes = [];

for (var i = 0; i < theSelection[0].length; i++) {
    var el = theSelection[0][i];
    var d = d3.select(el).datum();

    if (idsObj[d.id]) {
        filteredNodes.push(el);

        if (filteredNodes.length == ids.length) {
            break;
        }
    }
}

var filteredSelection = d3.selectAll(filteredNodes);

顺便说一句,是否可以做类似的事情:

var filteredSelection = d3.select();

for (…) {
    …
    filteredSelection.add(el);
    …
}