dc.graph
Version:
Graph visualizations integrated with crossfilter and dc.js
101 lines (96 loc) • 3.78 kB
JavaScript
var convert_tree_helper = function(data, attrs, options, parent, level, inherit) {
level = level || 0;
if(attrs.length > (options.valuesByAttr ? 1 : 0)) {
var attr = attrs.shift();
var nodes = [], edges = [];
var children = data.map(function(v) {
var key = v[options.nestKey];
var childKey = options.nestKeysUnique ? key : uuid();
if(childKey) {
var node;
if(options.ancestorKeys) {
inherit = inherit || {};
if(attr)
inherit[attr] = key;
node = Object.assign({}, inherit);
} else node = {};
node[options.nodeKey] = childKey;
if(options.label && options.labelFun)
node[options.label] = options.labelFun(key, attr, v);
if(options.level)
node[options.level] = level+1;
nodes.push(node);
if(parent) {
var edge = {};
edge[options.edgeSource] = parent;
edge[options.edgeTarget] = childKey;
edges.push(edge);
}
}
var children = options.valuesByAttr ? v[attrs[0]] : v.values;
var recurse = convert_tree_helper(children, attrs.slice(0), options,
childKey, level+1, Object.assign({}, inherit));
return recurse;
});
return {nodes: Array.prototype.concat.apply(nodes, children.map(dc.pluck('nodes'))),
edges: Array.prototype.concat.apply(edges, children.map(dc.pluck('edges')))};
}
else return {nodes: data.map(function(v) {
v = Object.assign({}, v);
if(options.level)
v[options.level] = level+1;
return v;
}), edges: data.map(function(v) {
var edge = {};
edge[options.edgeSource] = parent;
edge[options.edgeTarget] = v[options.nodeKey];
return edge;
})};
};
dc_graph.convert_tree = function(data, attrs, options) {
options = Object.assign({
nodeKey: 'key',
edgeKey: 'key',
edgeSource: 'sourcename',
edgeTarget: 'targetname',
nestKey: 'key'
}, options);
if(Array.isArray(data))
return convert_tree_helper(data, attrs, options, options.root, 0, options.inherit);
else {
attrs = [''].concat(attrs);
return convert_tree_helper([data], attrs, options, options.root, 0, options.inherit);
}
};
dc_graph.convert_nest = function(nest, attrs, nodeKeyAttr, edgeSourceAttr, edgeTargetAttr, parent, inherit) {
return dc_graph.convert_tree(nest, attrs, {
nodeKey: nodeKeyAttr,
edgeSource: edgeSourceAttr,
edgeTarget: edgeTargetAttr,
root: parent,
inherit: inherit,
ancestorKeys: true,
label: 'name',
labelFun: function(key, attr, v) { return attr + ':' + key; },
level: '_level'
});
};
dc_graph.convert_adjacency_list = function(nodes, namesIn, namesOut) {
// adjacenciesAttr, edgeKeyAttr, edgeSourceAttr, edgeTargetAttr, parent, inherit) {
var edges = Array.prototype.concat.apply([], nodes.map(function(n) {
return n[namesIn.adjacencies].map(function(adj) {
var e = {};
if(namesOut.edgeKey)
e[namesOut.edgeKey] = uuid();
e[namesOut.edgeSource] = n[namesIn.nodeKey];
e[namesOut.edgeTarget] = namesIn.targetKey ? adj[namesIn.targetKey] : adj;
if(namesOut.adjacency)
e[namesOut.adjacency] = adj;
return e;
});
}));
return {
nodes: nodes,
edges: edges
};
};