如何计算selectAll匹配的节点数? (没有连接数据)
或者如果有数据,如何统计选择的数据? (假设我用“数据(功能......)”设置它,所以我不知道提前的长度)
答案 0 :(得分:43)
只需使用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 here。
答案 1 :(得分:2)
我以前做过的一种方法是通过创建一个新对象将该信息传递给数据函数。
var rows = $('.fotm-table tr');
$(rows).each(function(){
$('input:first', $(this)).on('change', function(){
var fromValue = $(this).val();
var row = $(this).closest('tr');
$('td:last input', row).val(parseInt(fromValue) + 1);
});
});
然后在您的更新部分中,您使用对象并仍然可以使用计数。
.data(function(d) {
return d.Objects.map(function(obj) {
return {
Object: obj,
TotalObjects: d.Objects.length
}
});
答案 2 :(得分:0)
要获取数据,然后在.selectAll()和.data()之后,在.size()之前需要.enter():
legend_count = legendBoxG.selectAll("legend.box")
.data(curNodesData, (d) -> d.id)
.enter()
.size()
如果没有.enter(),则结果为0. .enter()使其返回数据计数。 (以上代码以咖啡方言显示。)
我需要在向我的svg对象添加属性之前获取计数(为了正确缩放它们),并且前面的示例都没有这样做。但是,在将计数剥离到如上所述的变量之后,我似乎无法添加更多属性。因此,虽然上述方法演示了data()和enter()的操作,但它并不是一个真正的解决方案。我所做的是在执行selectAll()之前获取数据数组本身的长度。我最简单的方法是使用数据数组本身的属性(不是函数):
legend_count = curNodesData.length
答案 3 :(得分:0)
如果您希望从回调函数方便地获取长度,例如设置element属性,似乎可以从第三个参数中获取长度,如下所示:
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文档中找到该文档,但是我注意到回调函数看起来像forEach JavaScript函数,因此很可疑,所以我在黑暗中拍摄了照片,有效。所以我想,要自担风险(除非有人可以指出我在d3中的记录)。