展平多个嵌套的层次数组 - d3.js
Flatten multiple nested hierarchial array - d3.js
我有一个包含四个级别的数组,我想将其展平。
具有两个起始数组元素和最低级别展平的简化代码:
var tstArray = [{Count:2,Yr:2008,Dep:"NDep_1",Periodtype:"Week",Period:1,Beds:5},
{Count:9,Yr:2008,Dep:"NDep_2",Periodtype:"Week",Period:1,Beds:10}
];
console.log(tstArray);
tstArray = d3.nest()
.key(function(d) { return d.Periodtype;})
.key(function(d) { return d.Yr;})
.key(function(d) { return d.Period;})
.key(function(d) { return d.Dep;})
.rollup(function(d) {
return {"Count":d3.sum(d, function(g) {return g.Count; }), "Beds":d3.sum(d, function(j) {return j.Beds;})};
}).entries(tstArray);
console.log(tstArray);
tstArray = tstArray.map(function(d){
var Periodtype = d.key
var values1 = d.values.map(function(e){
var Yr = e.key
var values2 = e.values.map(function(f){
var Period = f.key;
var values3 = f.values.map(function(g){
return{'Dep':g.key,Count':+g.values.Count,'Beds':+g.values.Beds}
});
return {'Period':Period,'values3':values3}
});
var tmparr = [];
for ( var i = 0, len=values2.length; i < len; i++) {
for ( var j = 0, lenj=values2[i].values3.length; j < lenj; j++) {
tmparr.push({ 'Period':values2[i].Period,
'Dep':values2[i].values3[j].Dep,
'Count': +values2[i].values3[j].Count,
'Beds': +values2[i].values3[j].Beds
});
};
};
return{'Year':Yar,'values2':tmparr}
});
return{'Periodtype':Periodtype,'values1':values1} })
;
console.log(tstArray);
现在,我认为我有一个解决方案。我可以为最低级别重做此操作(再进行三个),但这似乎是解决此问题的糟糕方法。我怎样才能一次完成所有的扁平化?我试过了,但我在 values3 方面运气不佳。我对这些概念的理解还是太肤浅了。非常感谢帮助。
好的,在得到关于探索哪些路线的一些帮助后,我选择了 for 循环,主要是因为数组是固定的,而且它最容易理解。
var tmparr = [];
for ( var i = 0, len=values2.length; i < len; i++) {
for ( var j = 0, lenj=values2[i].values3.length; j < lenj; j++) {
tmparr.push({ 'Period':values2[i].Period,
'Dep':values2[i].values3[j].Dep,
'Count': +values2[i].values3[j].Count,
'Beds': +values2[i].values3[j].Beds
});
};
};
return{'Year':Yar,'values2':tmparr}
然后我在下一层重复这个循环(我这样做主要是为了可读性,这样做我不必嵌套超过两层的 for 循环)。
我有一个包含四个级别的数组,我想将其展平。
具有两个起始数组元素和最低级别展平的简化代码:
var tstArray = [{Count:2,Yr:2008,Dep:"NDep_1",Periodtype:"Week",Period:1,Beds:5},
{Count:9,Yr:2008,Dep:"NDep_2",Periodtype:"Week",Period:1,Beds:10}
];
console.log(tstArray);
tstArray = d3.nest()
.key(function(d) { return d.Periodtype;})
.key(function(d) { return d.Yr;})
.key(function(d) { return d.Period;})
.key(function(d) { return d.Dep;})
.rollup(function(d) {
return {"Count":d3.sum(d, function(g) {return g.Count; }), "Beds":d3.sum(d, function(j) {return j.Beds;})};
}).entries(tstArray);
console.log(tstArray);
tstArray = tstArray.map(function(d){
var Periodtype = d.key
var values1 = d.values.map(function(e){
var Yr = e.key
var values2 = e.values.map(function(f){
var Period = f.key;
var values3 = f.values.map(function(g){
return{'Dep':g.key,Count':+g.values.Count,'Beds':+g.values.Beds}
});
return {'Period':Period,'values3':values3}
});
var tmparr = [];
for ( var i = 0, len=values2.length; i < len; i++) {
for ( var j = 0, lenj=values2[i].values3.length; j < lenj; j++) {
tmparr.push({ 'Period':values2[i].Period,
'Dep':values2[i].values3[j].Dep,
'Count': +values2[i].values3[j].Count,
'Beds': +values2[i].values3[j].Beds
});
};
};
return{'Year':Yar,'values2':tmparr}
});
return{'Periodtype':Periodtype,'values1':values1} })
;
console.log(tstArray);
现在,我认为我有一个解决方案。我可以为最低级别重做此操作(再进行三个),但这似乎是解决此问题的糟糕方法。我怎样才能一次完成所有的扁平化?我试过了,但我在 values3 方面运气不佳。我对这些概念的理解还是太肤浅了。非常感谢帮助。
好的,在得到关于探索哪些路线的一些帮助后,我选择了 for 循环,主要是因为数组是固定的,而且它最容易理解。
var tmparr = [];
for ( var i = 0, len=values2.length; i < len; i++) {
for ( var j = 0, lenj=values2[i].values3.length; j < lenj; j++) {
tmparr.push({ 'Period':values2[i].Period,
'Dep':values2[i].values3[j].Dep,
'Count': +values2[i].values3[j].Count,
'Beds': +values2[i].values3[j].Beds
});
};
};
return{'Year':Yar,'values2':tmparr}
然后我在下一层重复这个循环(我这样做主要是为了可读性,这样做我不必嵌套超过两层的 for 循环)。