Search code examples
javascriptd3.jscluster-computinghierarchical-clusteringinfovis

Convert Clusterfck array to JavaScript InfoVis Toolkit json hierarchical


Currently I am using the javascript library Clusterfck to perform a data grouping. This library generates an array in the following format:

[
  {"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
  }
]

But javascript libraries for data visualization how D3.js and Jit using JSON structures as shown below:

{
    "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
        }
    ]
}

I would like to convert these structures, using JavaScript or PHP. Could anyone help me?


Solution

  • If you just want to convert between these structures, this is pretty simple. See working fiddle: http://jsfiddle.net/nrabinowitz/vuk94/

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

    This uses a couple of ECMAScript 1.5 features (Array.isArray, forEach, and map), but if you're using d3 you're probably targeting browsers that support this anyway.