我有一个csv文件,其网络数据如下所示:
var list = [];
d3.csv("/graphs/documents/1/2015/10/15/16_43_12_data.csv", function(error, d) {
// var links_list = [ {"source": 1, "target": 0},{"source": 2, "target": 0},{"source": 3, "target": 0}, {"source": 4, "target": 0}];
// var nodes = [ {"name": 1}, {"name":2}, {"name":3}, {"name":4}, {"name":5}];
var nodes = d.map( function(d){ return {"name":+d.node}; });
var links_list = d.map( function(d) {
list_array = JSON.parse(d.edges.replace(/\(/g,"[").replace(/\)/g,"]"));
console.log(list_array);
var i, len = list_array.length;
for (i=0; i<len; i++) {
var s = arrayObjectIndexOf(nodes, list_array[i][0], "name");
var t = arrayObjectIndexOf(nodes, list_array[i][1], "name");
list.push({source: s ,target: t });
return {source: s , target: t };
}
});
... #create the graph using the data
});
目标是生成包含所有数据的网络。我已经在绘制节点了。但是,我在尝试绘制边缘时遇到问题。下面的代码只返回正确的五个第一个节点对,但它停在那里。
getExternalStorageDirectory()
var links_list 返回一个包含5个对象的数组,其中 source,target 对应于以下值: (1,2),(1,3),(1,4),(1,5),(2,1)
当我在console.log(list_array)上打印时,它返回带有4个元素的数组5次。为什么links_list还没有计算这些值? 列表数组也返回相同的东西......什么&#39;继续?这是一个逻辑问题吗?感谢您的帮助。
答案 0 :(得分:1)
这里有很多问题,第一个问题是你从for循环中的map函数返回,所以你的for循环实际上并没有做任何事情。
第二个可能的问题(不确定)是我见过的d3图形应用程序存储了边缘节点的实际js引用,而不仅仅是索引,所以{source:nodes[s], target:nodes[t]}
我会做一些更改,使其更易读,更容易理解:
首先,列出边缘的哪一行(文件格式的人类可读性除外)没有什么特别之处,所以为了更容易推理程序,我将它们全部归为一体大堆而不是试图嵌套循环:
function flatten(a,b){return a.concat(b);}
var edgeNumbers=d.map(function(row){
return JSON.parse(row.edges.replace(/\(/g,"[").replace(/\)/g,"]"))
}).reduce(flatten,[]);
第二,(假设我在边缘存储引用是正确的,而不是索引数),我会&#34;索引&#34;您的节点数组使用对象:
function indexBy(key){return function(prev,x){prev[x[key]]=x;return prev;};}
var nodesByName=nodes.reduce(indexBy("name"),{});
从那里,边缘只是:
edgeNumbers.map(function(namepair){
return {source:nodesByName[namepair[0]],target:nodesByName[namepair[1]]};
});