Javascript D3中的数组变换

Javascript D3中的数组变换,javascript,arrays,json,d3.js,Javascript,Arrays,Json,D3.js,从中转换数组的最佳方法是什么 [{ “国家”:“维克”, “年龄组1”:10岁, “年龄组2”:20岁, “年龄组3”:30岁, “年龄组4”:40岁, “年龄组”5岁:50岁, }, { “州”:“新南威尔士州”, “年龄组1”:60岁, “年龄组2”:70岁, “年龄组3”:80岁, “年龄组4”:90岁, “年龄组”5分:100, }, { “州”:“TA”, “年龄组1”:11岁, “年龄组2”:21岁, “年龄组3”:31岁, “年龄组4”:41岁, “年龄组”5岁:51岁, }, {

从中转换数组的最佳方法是什么

[{
“国家”:“维克”,
“年龄组1”:10岁,
“年龄组2”:20岁,
“年龄组3”:30岁,
“年龄组4”:40岁,
“年龄组”5岁:50岁,
}, {
“州”:“新南威尔士州”,
“年龄组1”:60岁,
“年龄组2”:70岁,
“年龄组3”:80岁,
“年龄组4”:90岁,
“年龄组”5分:100,
}, {
“州”:“TA”,
“年龄组1”:11岁,
“年龄组2”:21岁,
“年龄组3”:31岁,
“年龄组4”:41岁,
“年龄组”5岁:51岁,
}, {
“状态”:“qld”,
“年龄组1”:61岁,
“年龄组2”:71岁,
“年龄组3”:81岁,
“年龄组4”:91岁,
“年龄组”第5组:101,
}]
对此

[{
“年龄组”:“年龄组1”,
“国家”:[{
“姓名”:“维克”,
“价值”:10
}, {
“名称”:“新南威尔士州”,
“价值”:60
}, {
“姓名”:“助教”,
“价值”:11
}, {
“名称”:“qld”,
“价值”:61
}]
}, {
“年龄组”:“年龄组2”,
“国家”:[{
“姓名”:“维克”,
“价值”:20
}, {
“名称”:“新南威尔士州”,
“价值”:70
}, {
“姓名”:“助教”,
“价值”:21
}, {
“名称”:“qld”,
“价值”:71
}]
}, {
“年龄组”:“年龄组3”,
“国家”:[{
“姓名”:“维克”,
“价值”:30
}, {
“名称”:“新南威尔士州”,
“价值”:80
}, {
“姓名”:“助教”,
“价值”:31
}, {
“名称”:“qld”,
“价值”:81
}]
}, {
“年龄组”:“年龄组5”,
“国家”:[{
“姓名”:“维克”,
“价值”:40
}, {
“名称”:“新南威尔士州”,
“价值”:90
}, {
“姓名”:“助教”,
“价值”:41
}, {
“名称”:“qld”,
“价值”:91
}]
}, {
“年龄组”:“年龄组5”,
“国家”:[{
“姓名”:“维克”,
“价值”:50
}, {
“名称”:“新南威尔士州”,
“价值”:100
}, {
“姓名”:“助教”,
“价值”:51
}, {
“名称”:“qld”,
“价值”:101
}]
}]
使用简单的javascript和循环我可以做到,但我想使用d3函数或任何其他处理数据转换的库


哪个库是数据转换的最佳库。

您可以尝试以下方法:

var数据=[{州:“维克”,年龄组1:10,年龄组2:20,年龄组3:30,年龄组4:40,年龄组5:50},{州:“新南威尔士州”,年龄组1:60,年龄组2:70,年龄组3:80,年龄组4:90,年龄组5:100},{州:“塔斯州”,年龄组1:11,年龄组2:21,年龄组3:51,年龄组D},年龄组1:61,年龄组2:71,年龄组3:81,年龄组4:91,年龄组5:101});
var_tmp={}
var kepReg=/^年龄组/;
data.forEach(功能(项){
用于(项目中的变量k){
if(kepReg.试验(k)){
如果(!\u tmp[k])
_tmp[k]={
国家:[]
};
_tmp[k].state.push({
名称:项目[“状态”],
价值:项目[k]
})
}
}
});
var result=Object.keys(_tmp).map(函数(k){
返回{
年龄组别:k,,
状态:_tmp[k]。状态
}
});

document.write(“+JSON.stringify(result,0,4)+”)
您可以尝试以下方法:

var basedata = the original array from your question;

// I assume your data already has this array of categories somewhere,
// but if it doesn't, let's just declare it here:
var age_groups = [
  "age_group_1",
  "age_group_2",
  "age_group_3",
  "age_group_4",
  "age_group_5"
];

var transformed = age_groups.map(group => {
  return {
    age_group: group,
    states: basedata.map(set => {
      return { state: set.state, value: set[group] }
    })
  };
});
var数据=[{州:“维克”,年龄组1:10,年龄组2:20,年龄组3:30,年龄组4:40,年龄组5:50},{州:“新南威尔士州”,年龄组1:60,年龄组2:70,年龄组3:80,年龄组4:90,年龄组5:100},{州:“塔斯州”,年龄组1:11,年龄组2:21,年龄组3:51,年龄组D},年龄组1:61,年龄组2:71,年龄组3:81,年龄组4:91,年龄组5:101});
var_tmp={}
var kepReg=/^年龄组/;
data.forEach(功能(项){
用于(项目中的变量k){
if(kepReg.试验(k)){
如果(!\u tmp[k])
_tmp[k]={
国家:[]
};
_tmp[k].state.push({
名称:项目[“状态”],
价值:项目[k]
})
}
}
});
var result=Object.keys(_tmp).map(函数(k){
返回{
年龄组别:k,,
状态:_tmp[k]。状态
}
});

document.write(“+JSON.stringify(result,0,4)+”)
利用现代JS,而不是试图让D3这样做-这是非常简单的代码:

var basedata = the original array from your question;

// I assume your data already has this array of categories somewhere,
// but if it doesn't, let's just declare it here:
var age_groups = [
  "age_group_1",
  "age_group_2",
  "age_group_3",
  "age_group_4",
  "age_group_5"
];

var transformed = age_groups.map(group => {
  return {
    age_group: group,
    states: basedata.map(set => {
      return { state: set.state, value: set[group] }
    })
  };
});
完成了

这样做之所以有效,是因为您希望在您的年龄组上设置对象的关键帧,因此我们首先确保基于这些对象创建映射。然后,对于每个年龄组,我们只需运行基本数据并返回状态/值对。没有什么真正复杂的,ES6/ES2015为我们完成了这项工作


不喜欢ES6/ES2015?这是一个很好的适应时代的机会,但也很容易重写为旧的ES5格式:用
函数(…){return…}
替换每个
(…)=>{…}
,然后就完成了。

利用现代JS,而不是试图让D3完成它-代码非常简单:

完成了

这样做之所以有效,是因为您希望在您的年龄组上设置对象的关键帧,因此我们首先确保基于这些对象创建映射。然后,对于每个年龄组,我们只需运行基本数据并返回状态/值对。没有什么真正复杂的,ES6/ES2015为我们完成了这项工作


不喜欢ES6/ES2015?很好的适应时代的机会,但也很容易重写为旧的ES5格式:将每个
(…)=>{…}
替换为
函数(…){return…}
并完成。

您可以使用一个临时对象作为对结果数组的引用

var数据=[{“州”:“维克”,“年龄组”1:10,“年龄组”2:20,“年龄组”3:30,“年龄组”4:40,“年龄组”5:50,},{“州”:“新南威尔士”,“年龄组”1:60,“年龄组”2:70,“年龄组”3:80,“年龄组”4:90,“年龄组”5:100,{“州”:“塔斯”,“年龄组”1:11,“年龄组”,年龄组2:70,“年龄组”,年龄组4:41,“年龄组”5:51,},{“州”:“qld”,“年龄组”1:61,“年龄组”2:71,“年龄组”3:81,“年龄组”4:91,“年龄组”5:101,},
结果=[];
data.forEach(函数(a){
Object.keys(a).forEach(函数(k){
如果(k!=“状态”){
如果(!此[k]){
这个[k]={age_group:k,states:[]};
结果.推(这个[k]);
}
this[k].states.push({name:a.state,value:a[k]});
}
},这个);
}, {});

document.write(''+JSON.stringify(result,0,4)+'');
您可以使用临时对象
var basedata = the original array from your question;

// I assume your data already has this array of categories somewhere,
// but if it doesn't, let's just declare it here:
var age_groups = [
  "age_group_1",
  "age_group_2",
  "age_group_3",
  "age_group_4",
  "age_group_5"
];

var transformed = age_groups.map(group => {
  return {
    age_group: group,
    states: basedata.map(set => {
      return { state: set.state, value: set[group] }
    })
  };
});