将Clusterfck数组转换为JavaScript InfoVis Toolkit json分层

将Clusterfck数组转换为JavaScript InfoVis Toolkit json分层,javascript,d3.js,cluster-computing,hierarchical-clustering,infovis,Javascript,D3.js,Cluster Computing,Hierarchical Clustering,Infovis,目前,我正在使用javascript库执行数据分组。此库生成以下格式的数组: [ {"canonical":[20,120,102], "size":1 }, {"canonical":[250,255,253], "left":{ "canonical":[250,255,253], "size":1 }, "right":{ "canonical":[255,255,240], "size":1 }

目前,我正在使用javascript库执行数据分组。此库生成以下格式的数组:

[
  {"canonical":[20,120,102],
   "size":1
  },
  {"canonical":[250,255,253],
   "left":{
      "canonical":[250,255,253],
      "size":1
    },
   "right":{
      "canonical":[255,255,240],
      "size":1
    },
   "size":2
  },
  {"canonical":[100,54,300],
   "size":1
  }
]
但是用于数据可视化的javascript库如何使用D3.js和JSON结构,如下所示:

{
    "canonical":"Pai",
    "children":[
        {"canonical":[20,120,102],  "size":1},
        {
            "canonical":[250,255,253],
            "children": [
                {"canonical":[250,255,253], "size":1},
                {"canonical":[255,255,240], "size":1}               
            ],
            "size":2
        },
        {
            "canonical":[100,54,300],
            "size":1
        }
    ]
}

我想使用JavaScript或PHP转换这些结构。有人能帮我吗?

如果您只想在这些结构之间进行转换,这非常简单。参见工作小提琴:

这使用了ECMAScript 1.5的两个特性(
Array.isArray
forEach
、和
map
),但如果您使用的是d3,那么您的目标可能是支持这一特性的浏览器

function convert(input, rootName) {
    // top level
    if (Array.isArray(input)) {
        return {
            "canonical": rootName,
            "children": input.map(convert)
        };
    }
    // node
    else {
        ['left', 'right'].forEach(function(side) {
            if (input[side]) {
                input.children = input.children || [];
                input.children.push(convert(input[side]));
                delete input[side];
            }
        });
        return input;
    }
}