Javascript 从D3列表中形成年龄组的最佳方式是什么?
我刚开始绕着D3和arraysorting转 我有一张“人”的名单。我想按性别显示不同年龄组的人数Javascript 从D3列表中形成年龄组的最佳方式是什么?,javascript,arrays,json,d3.js,Javascript,Arrays,Json,D3.js,我刚开始绕着D3和arraysorting转 我有一张“人”的名单。我想按性别显示不同年龄组的人数 {"age": 73, "sex": "F"},{"age": 65,"sex": "M"} ... 结果可能是: male = {"age-group" : "0-10", "count" : "3"}, ... 或 我浏览了所有关于d3和支持库的可用教程。我觉得我可以通过使用scales和d3.nest或crossfilter.js来管理这项任务,其中包含性别维度和年龄过滤。但不知怎的,我
{"age": 73, "sex": "F"},{"age": 65,"sex": "M"} ...
结果可能是:
male = {"age-group" : "0-10", "count" : "3"}, ...
或
我浏览了所有关于d3和支持库的可用教程。我觉得我可以通过使用scales和d3.nest或crossfilter.js来管理这项任务,其中包含性别维度和年龄过滤。但不知怎的,我觉得我错过了什么。您建议采用什么方法?第一个假设是您有一个数组。
{“年龄”:73,“性别”:“F”},{“年龄”:65,“性别”:“M”}。。。
是具有键值对的对象。不需要一个称为“key”的密钥,因为这是多余的。无论哪种情况,这都不是一个D3问题,而是一个关于排序的问题。有很多方法可以做到这一点。例如,双嵌套将是:
var nest = d3.nest()
.key(function(d) { return d.sex; })
.key(function(d){
var ageGroup = null;
if (d.age <= 10){
ageGroup = '0-10';
} else if (d.age > 10 && d.age <= 20 ){
ageGroup = '10-20';
} else if (d.age > 20 && d.age <= 30 ){
ageGroup = '20-30';
} else if (d.age > 30 && d.age <= 40 ){
ageGroup = '30-40';
} else if (d.age > 40 && d.age <= 50 ){
ageGroup = '40-50';
} else if (d.age > 50 && d.age <= 60 ){
ageGroup = '50-60';
} else if (d.age > 60 && d.age <= 70 ){
ageGroup = '60-70';
} else if (d.age > 70 && d.age <= 80 ){
ageGroup = '70-80';
} else if (d.age > 80 && d.age <= 90 ){
ageGroup = '80-90';
} else if (d.age > 90 && d.age <= 100 ){
ageGroup = '90-100';
}
return ageGroup;
})
.entries(myArray);
简单的JavaScript解决方案可能更合适:
var rV = {};
myArray.forEach(function(d){
if (!rV[d.sex]){
rV[d.sex] = {};
}
var ageGroup = null;
if (d.age <= 10){
ageGroup = '0-10';
} else if (d.age > 10 && d.age <= 20 ){
ageGroup = '10-20';
} else if (d.age > 20 && d.age <= 30 ){
ageGroup = '20-30';
} else if (d.age > 30 && d.age <= 40 ){
ageGroup = '30-40';
} else if (d.age > 40 && d.age <= 50 ){
ageGroup = '40-50';
} else if (d.age > 50 && d.age <= 60 ){
ageGroup = '50-60';
} else if (d.age > 60 && d.age <= 70 ){
ageGroup = '60-70';
} else if (d.age > 70 && d.age <= 80 ){
ageGroup = '70-80';
} else if (d.age > 80 && d.age <= 90 ){
ageGroup = '80-90';
} else if (d.age > 90 && d.age <= 100 ){
ageGroup = '90-100';
}
if (!rV[d.sex][ageGroup]){
rV[d.sex][ageGroup] = [];
}
rV[d.sex][ageGroup].push(d);
});
然后可在以下位置进行过滤:
你是对的,我把这个d3具体化了,因为d3似乎就是为这个而设计的,并且提供了很多函数,比如nest().Thanx!这正是我想要的。不过我还是觉得会有更方便的方法。我想您可以使用for循环和scale()来减少冗余。
{
"key": "F",
"values": [
{
"key": "70-80",
"values": [
{
"age": 79.68865430448204,
"sex": "F"
},
{
"age": 70.66421345807612,
"sex": "F"
}
]
},
{
"key": "40-50",
"values": [
{
"age": 41.92759427241981,
"sex": "F"
}
]
},
....
var rV = {};
myArray.forEach(function(d){
if (!rV[d.sex]){
rV[d.sex] = {};
}
var ageGroup = null;
if (d.age <= 10){
ageGroup = '0-10';
} else if (d.age > 10 && d.age <= 20 ){
ageGroup = '10-20';
} else if (d.age > 20 && d.age <= 30 ){
ageGroup = '20-30';
} else if (d.age > 30 && d.age <= 40 ){
ageGroup = '30-40';
} else if (d.age > 40 && d.age <= 50 ){
ageGroup = '40-50';
} else if (d.age > 50 && d.age <= 60 ){
ageGroup = '50-60';
} else if (d.age > 60 && d.age <= 70 ){
ageGroup = '60-70';
} else if (d.age > 70 && d.age <= 80 ){
ageGroup = '70-80';
} else if (d.age > 80 && d.age <= 90 ){
ageGroup = '80-90';
} else if (d.age > 90 && d.age <= 100 ){
ageGroup = '90-100';
}
if (!rV[d.sex][ageGroup]){
rV[d.sex][ageGroup] = [];
}
rV[d.sex][ageGroup].push(d);
});
{
"M": {
"40-50": [
{
"age": 47.67825324088335,
"sex": "M"
}
],
"50-60": [
{
"age": 50.14032511971891,
"sex": "M"
}
],
"20-30": [
{
"age": 28.564708586782217,
"sex": "M"
},
{
"age": 20.309976511634886,
"sex": "M"
}
],
...
rV[aSex][anAgeGroup]