Combining Parent and Nested Data with d3.js

前端 未结 3 1894
臣服心动
臣服心动 2020-12-28 18:44

I have a data structure like this (assume that the data structure is non-negotiable):

data = {
    segments : [
        {x : 20, size : 10,          


        
3条回答
  •  一个人的身影
    2020-12-28 19:17

    You could do something like the following to restructure your data:

    newdata = data.segments.map(function(s) {
      return s.colors.map(function(d) {
        var o = this; // clone 'this' in some manner, for example:
        o = ["x", "size"].reduce(function(obj, k) { return(obj[k] = o[k], obj); }, {});
        return (o.color = d, o); 
      }, s);
    });
    

    This will transform your input data into:

    // newdata:
        [
          [
            {"size":10,"x":20,"color":"#ff0000"},
            {"size":10,"x":20,"color":"#00ff00"}],
          [
            {"size":20,"x":40,"color":"#0000ff"},
            {"size":20,"x":40,"color":"#000000"}
          ]
        ]
    

    which then can be used in the standard nested data selection pattern:

    var nested = vis.selectAll('g')
        .data(newdata)
      .enter().append('g');
    
    nested.selectAll('rect')
        .data(function(d) { return d; })
      .enter().append('rect')
        .attr('x',pos)
        .attr('y',pos)
        .attr('width',size)
        .attr('height',size)
        .attr('fill',f);
    

    BTW, if you'd like to be more d3-idiomatic, I would change the indentation style a bit for the chained methods. Mike proposed to use half indentation every time the selection changes. This helps to make it very clear what selection you are working on. For example in the last code; the variable nested refers to the enter() selection. See the 'selections' chapter in: http://bost.ocks.org/mike/d3/workshop/

提交回复
热议问题