【问题标题】:Flatten multiple nested hierarchial array - d3.js展平多个嵌套层次数组 - d3.js
【发布时间】:2015-05-08 02:37:03
【问题描述】:

我有一个想要展平的包含四个级别的数组。

具有两个起始数组元素和最底层扁平化的简化代码:

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

JsFiddle

现在,我想我有一个解决方案。我可以在最低级别重做这个(再做三个),但这似乎是一个不好的方法。我怎样才能一口气把所有的扁平化?我已经尝试过,但我对 values3 运气不佳。我对这些概念的理解还是太肤浅。非常感谢您的帮助。

【问题讨论】:

  • 听起来像是递归的工作。看看flatten 函数here。 (如果你想完全适应递归,但还没有,我推荐这本书The Little Schemer。)
  • 如果你使用其他库没问题,你可以使用underscore.js(underscorejs.org/#flatten)中的.flatten函数,它似乎不关心子级别
  • @Mars :谢谢,它确实变平了,但我可以很容易地将它展平为数组数组吗?
  • @tomtomtom:谢谢,我已经从那个库中看到了很多有用的函数,但是如果我试图避免在这一点上添加更多库。
  • 我还没有考虑过那个特殊的功能是否是你需要的。可能不是。我认为它概括地说明了一种你可以适应做你想做的事情的方法。据我了解,您的问题是如何以简单的方式展平多个级别。最简单的方法是使用递归。 Bostock 的flatten 只是您可以用作编写自己的flatten 函数的起点的众多插图之一。一旦你完全理解了这些概念,我所说的一切都会变得显而易见。

标签: javascript arrays d3.js flatten


【解决方案1】:

好的,在探索了哪些路线后,我决定使用 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 循环)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多