web-dev-qa-db-fra.com

d3 selectAll: compter les résultats

Comment puis-je compter le nombre de nœuds correspondant à un selectAll? (sans données jointes)

Ou s'il y a des données, comment compter les données de la sélection? (supposons que je l'ai réglé avec "data (function ...)" donc je ne connais pas la longueur à l'avance)

22
Vituel

Utilisez simplement d3.selectAll(data).size(). J'espère que cet exemple vous aidera:

 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();

Remplissez jsfiddle ici .

48
Gabriel

Une façon dont j'ai déjà fait cela est de transmettre ces informations à la fonction de données en créant un nouvel objet.

 .data(function(d) {         
     return d.Objects.map(function(obj) {
         return {
             Object: obj,
             TotalObjects: d.Objects.length
         }
   });

Ensuite, dans vos parties de mise à jour, vous utilisez Object et vous avez toujours le nombre disponible.

.attr("x", function(d) {

    return d.Object.X;
 })
 .attr("y", function(d) {

    return d.TotalObjects;
 })
2
Andy Lewis

Pour obtenir le nombre de données, puis après .selectAll () et .data (), il apparaît que .enter () est nécessaire avant .size ():

legend_count = legendBoxG.selectAll("legend.box")
                         .data(curNodesData, (d) -> d.id)
                         .enter()
                         .size()

Sans le .enter (), le résultat est 0. Le .enter () lui fait retourner le nombre de données. (Le code ci-dessus est indiqué dans le dialecte du café.)

J'ai besoin d'obtenir le compte avant en ajoutant des attributs à mes objets svg (afin de les mettre à l'échelle correctement), et aucun des exemples précédents n'a fait cela. Cependant, je n'arrive pas à ajouter plus d'attributs après avoir supprimé le nombre dans une variable comme ci-dessus. Ainsi, bien que l'approche ci-dessus montre le fonctionnement de data () et enter (), ce n'est pas vraiment une solution pratique. Ce que je fais à la place est d'obtenir la longueur du tableau de données lui-même avant faisant le selectAll (). Je peux le faire plus simplement avec la longueur propriété (pas une fonction) sur le tableau de données lui-même:

 legend_count = curNodesData.length
0
user2958908

Si vous voulez commodément la longueur d'une fonction de rappel, comme la définition d'un attribut d'élément, il semble que vous pouvez l'obtenir à partir du troisième argument, comme ceci:

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

Pour la vie de moi, je n'ai pu trouver cela documenté dans la documentation d3 nulle part, mais j'ai remarqué que les fonctions de rappel ressemblaient étrangement à la fonction javascript forEach , alors j'ai pris une photo dans l'obscurité, et ça a marché. Donc, je suppose, utilisez à vos risques et périls (à moins que quelqu'un ne puisse m'indiquer où cela est documenté en d3).

0
V. Rubinetti