#javascript #d3.js
#javascript #d3.js
Вопрос:
Учитывая большой выбор (несколько десятков тысяч) Я хочу отфильтровать один или несколько элементов, соответствующих заданным идентификаторам.
На данный момент я использую что-то вроде этого:
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];
});
Что мне не нравится в этом решении, так это то, что время выполнения на самом деле не зависит от количества идентификаторов. Итерация выполняется по всей выборке независимо от того, все ли идентификаторы уже найдены.
Есть ли способ вручную выполнить итерацию по выбору? Я уже theSelection.each()
, однако, похоже, что нет способа прервать итерацию. Или вы знаете другой подход?
РЕДАКТИРОВАТЬ: может быть, я смогу работать с чем-то подобным:
for (var i = 0; i < theSelection[0].length; i ) {
// d3.select(theSelection[0][i]).datum().id
};
Комментарии:
1. если у вас есть theSelection, вы можете просто повторить его с помощью простого цикла.
2. Как я сделал в отредактированном сообщении?
3. Да, именно это я и имел в виду.:)
Ответ №1:
Хорошо, я думаю, у меня есть решение. Пожалуйста, прокомментируйте, если есть еще лучший способ 😉
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);
…
}