1

我正在d3 中制作树形图,它需要数据作为一系列嵌套对象,如下所示:

{
    name: "flare",
    children: [
        {
            name: "analytics",
            children: [
                {
                    name: "cluster",
                    children: [
                        {
                            name: "AgglomerativeCluster",
                            size: 3938
                        },
                        {
                            name: "CommunityStructure",
                            size: 3812
                        }
                    ]
                }
            ]
        }
    ]
}

在幕后收集这些数据的自然方法是作为字典(在 Python 术语中),如下所示:

{
    "flare": {
         "analytics": {
              "cluster": [
                   {
                       name: "AgglomerativeCluster",
                       size: 3938
                   },
 //etc etc

在不手动编写嵌套循环的情况下从后者到前者的最自然方法是什么?

4

1 回答 1

0

编辑:我刚刚意识到我的答案以错误的方式进行操作(从第一个版本到第二个版本)。但是,您可以将相同的原理用于其他方式。

您可能还想看看d3.nest(),如下所述:D3 JSON 数据转换


我会创建一个递归函数来实现这个目标。我不得不使用 jQuery 将子数组的每个元素映射到其更新版本:

function reduce(dataset){ 
    if('children' in dataset) {
        var tmp = {}
        tmp[dataset.name] = $.map(dataset.children, function(d){return reduce(d)})
        return tmp
    } else {
        return dataset
    }
}

当应用于您的示例数据集时,这给出了:

{
    "flare": [{
        "analytics": [{
            "cluster": [{
                "name": "AgglomerativeCluster",
                "size": 3938
            }, {
                "name": "CommunityStructure",
                "size": 3812
            }]
        }]
    }]
}

jsFiddle:http: //jsfiddle.net/chrisJamesC/kKDm3/

于 2013-04-10T17:23:43.827 回答