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