Как подсчитать, сколько узлов было сопоставлено с selectAll? (без объединенных данных)
Или, если есть данные, как подсчитать данные из выделения? (предположим, что я установил его с помощью "data (function...)", поэтому я не знаю длины заранее)
Как подсчитать, сколько узлов было сопоставлено с selectAll? (без объединенных данных)
Или, если есть данные, как подсчитать данные из выделения? (предположим, что я установил его с помощью "data (function...)", поэтому я не знаю длины заранее)
Просто используйте d3.selectAll(data).size()
Надеемся, что этот пример поможет вам:
var matrix = [
[11975, 5871, 8916, 2868],
[ 1951, 10048, 2060, 6171],
[ 8010, 16145, 8090, 8045],
[ 1013, 990, 940, 6907]
];
var tr = d3.select("body").append("table").selectAll("tr")
.data(matrix)
.enter().append("tr");
var td = tr.selectAll("td")
.data(function(d) { return d; })
.enter().append("td")
.text(function(d) { return d; });
var tdSize=tr.selectAll("td").size();
Выполните здесь jsfiddle.
Один из способов, который я сделал ранее, - передать эту информацию в функцию данных, создав новый объект.
.data(function(d) {
return d.Objects.map(function(obj) {
return {
Object: obj,
TotalObjects: d.Objects.length
}
});
Затем в ваших частях обновления вы используете Object и по-прежнему имеете доступное количество.
.attr("x", function(d) {
return d.Object.X;
})
.attr("y", function(d) {
return d.TotalObjects;
})
Чтобы получить количество данных, затем после.selectAll() и.data(), кажется, что.enter() требуется до.size():
legend_count = legendBoxG.selectAll("legend.box")
.data(curNodesData, (d) -> d.id)
.enter()
.size()
Без.enter() результат равен 0. Функция.enter() заставляет его возвращать количество данных. (Код выше показан на кофейном диалекте.)
Мне нужно получить счет перед добавлением атрибутов в мои объекты SVG (чтобы их правильно масштабировать), и ни один из предыдущих примеров не сделал этого. Однако я не могу добавить больше атрибутов после удаления счетчика в переменную, как указано выше. Таким образом, хотя вышеприведенный подход демонстрирует работу data() и enter(), это не очень практическое решение. Вместо этого я должен сам получить длину массива данных, прежде чем делать selectAll(). Я могу сделать это проще всего с помощью свойства length (а не функции) в самом массиве данных:
legend_count = curNodesData.length
Если вам удобно получить длину из функции обратного вызова, такой как установка атрибута элемента, кажется, что вы можете получить ее из третьего аргумента, например, так:
node
.attr('some-property', (d, i, a) => {
// d = the individual data point
// i = the index of the data point (0, 1, 2, 3, etc)
// a = the array of data points
// a.length = the size/length of the data points / dataset
return ( some calculation involving a.length or whatever);
});
Насколько я мог судить, я нигде не мог найти это в документации по d3, но заметил, что функции обратного вызова выглядят подозрительно, как функция javascript forEach, поэтому я сделал снимок в темноте, и это сработало. Поэтому я полагаю, используйте на свой страх и риск (если кто-то не может указать мне, где это задокументировано в d3).