d3 selectAll: количество результатов

Как подсчитать, сколько узлов было сопоставлено с selectAll? (без объединенных данных)

Или, если есть данные, как подсчитать данные из выделения? (предположим, что я установил его с помощью "data (function...)", поэтому я не знаю длины заранее)

Ответ 1

Просто используйте 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.

Ответ 2

Один из способов, который я сделал ранее, - передать эту информацию в функцию данных, создав новый объект.

 .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;
 })

Ответ 3

Чтобы получить количество данных, затем после.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

Ответ 4

Если вам удобно получить длину из функции обратного вызова, такой как установка атрибута элемента, кажется, что вы можете получить ее из третьего аргумента, например, так:

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).