将平面表转换为层次结构



我想把一个表从csv转换成一个层次结构。该表的格式如下:

lvl1 lvl2 lvl3 size
A    a    1    1
A    a    2    2
A    b    1    3
A    b    2    4
B    a    1    5
B    a    2    6
B    b    1    7
B    b    2    8

转换为下面的JSON对象。

我这样使用d3.nest:

var n = d3.nest()
.key(d => d.lvl1)
.key(d => d.lvl2)
.key(d => d.lvl3)
.entries(d)

,其结果是以下格式,这几乎是我想传递给d3.hierarchy:

[{
"key": "A",
"values": [{
"key": "a",
"values": [{
"key": "1",
"values": [{
"lvl1": "A",
"lvl2": "a",
"lvl3": 1,
"size": 1
}]
},
{
"key": "2",
"values": [{
"lvl1": "A",
"lvl2": "a",
"lvl3": 2,
"size": 2
}]
}
]
}]
}
//...
]

但是,这增加了太多的级别,理想情况下我希望有以下输出:

[{
"key": "A",
"values": [{
"key": "a",
"values": [{
"key": "1",
"size": 1
},
{
"key": "2",
"size": 2
}
]
}]
} //,...
]

这个格式我可以方便地传递给d3.hierarchy(n, d => d.values)。如何做到这一点?

注意:我不关心叶子中是否有额外的字段,因此,只要叶子不再嵌套,这样的输出也会很好:

[{
"key": "A",
"values": [{
"key": "a",
"values": [{
"key": "1",
"lvl1": "A",
"lvl2": "a",
"lvl3": 1,
"size": 1
},
{
"key": "2",
"lvl1": "A",
"lvl2": "a",
"lvl3": 2,
"size": 2
}
]
}]
} //,...
]
JSON

>
[{
"lvl1": "A",
"lvl2": "a",
"lvl3": 1,
"size": 1
},
{
"lvl1": "A",
"lvl2": "a",
"lvl3": 2,
"size": 2
},
{
"lvl1": "A",
"lvl2": "b",
"lvl3": 1,
"size": 3
},
{
"lvl1": "A",
"lvl2": "b",
"lvl3": 2,
"size": 4
},
{
"lvl1": "B",
"lvl2": "a",
"lvl3": 1,
"size": 5
},
{
"lvl1": "B",
"lvl2": "a",
"lvl3": 2,
"size": 6
},
{
"lvl1": "B",
"lvl2": "b",
"lvl3": 1,
"size": 7
},
{
"lvl1": "B",
"lvl2": "b",
"lvl3": 2,
"size": 8
}
]

你可以得到你想要的rollup:

const n = d3.nest()
.key(d => d.lvl1)
.key(d => d.lvl2)
.rollup(d => d.map(e => ({
key: e.lvl3,
size: e.size
})))
.entries(data);

下面是演示:

const data = [{
"lvl1": "A",
"lvl2": "a",
"lvl3": 1,
"size": 1
},
{
"lvl1": "A",
"lvl2": "a",
"lvl3": 2,
"size": 2
},
{
"lvl1": "A",
"lvl2": "b",
"lvl3": 1,
"size": 3
},
{
"lvl1": "A",
"lvl2": "b",
"lvl3": 2,
"size": 4
},
{
"lvl1": "B",
"lvl2": "a",
"lvl3": 1,
"size": 5
},
{
"lvl1": "B",
"lvl2": "a",
"lvl3": 2,
"size": 6
},
{
"lvl1": "B",
"lvl2": "b",
"lvl3": 1,
"size": 7
},
{
"lvl1": "B",
"lvl2": "b",
"lvl3": 2,
"size": 8
}
];
var nested = d3.nest()
.key(d => d.lvl1)
.key(d => d.lvl2)
.rollup(d => d.map(e => ({
key: e.lvl3,
size: e.size
})))
.entries(data);
console.log(nested);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

相关内容

  • 没有找到相关文章

最新更新