javascript - 为什么我的 map 函数没有返回 d3 js 中的所有 csv 文件行?

标签 javascript csv d3.js logic map-function

我有一个 csv 文件,其中的网络数据如下所示:

node,edges,centrality_degree
1,"[(1, 2), (1, 3), (1, 4), (1, 5)]",1.0
2,"[(2, 1), (2, 3), (2, 4), (2, 5)]",1.0
3,"[(3, 1), (3, 2), (3, 4), (3, 5)]",1.0
4,"[(4, 1), (4, 2), (4, 3), (4, 5)]",1.0
5,"[(5, 1), (5, 2), (5, 3), (5, 4)]",1.0

目标是生成一个包含所有数据的网络。我已经在绘制节点了。但是,我在尝试绘制边缘时遇到问题。下面的代码仅正确返回前五个节点对,但它就停在那里。

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

});

var links_list 返回一个包含 5 个对象的数组,其中 source, target 对对应于以下值: (1, 2), (1, 3), (1, 4), (1, 5), (2, 1)

当我在 console.log(list_array) 上打印时,它会返回包含 4 个元素的数组 5 次。为什么 links_list 不也计算这些值? 列表数组也返回相同的东西...发生了什么?是逻辑问题吗?感谢您的帮助。

最佳答案

这里有很多问题,第一个是你从 for 循环内部的 map 函数返回,所以你的 for 循环实际上没有做任何事情。

第二个可能的问题(不确定)是我见过的 d3 图形应用程序存储对边缘节点的实际 js 引用,而不仅仅是索引,因此 {source:nodes[s] ,目标:节点[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,[]);

其次,(假设我在边缘存储引用而不是索引数字是正确的),我将使用对象“索引”节点数组:

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

关于javascript - 为什么我的 map 函数没有返回 d3 js 中的所有 csv 文件行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33178954/

相关文章:

javascript - Ionic 框架 - 弹出取消按钮不起作用 - v1.0.0-beta.1 "actinium"

Javascript:检查是否可以通过组合数组中的其他字符串来重新创建字符串?

java - 将单个 CSV/TSV 字符串转换为 Java 对象?

javascript - D3 对象全部渲染为 0px x 0px,没有属性

javascript - 引入 d3.js 的麻烦

javascript - Uncaught ReferenceError : ActiveXObject is not defined Error in Chrome

javascript - 垂直和水平居中以及javascript滚动的问题

php - CSV 或 Mysql 用于静态数据?

java - 如何以特定定义的排序顺序有效读取 csv 列表?

javascript - 在 topojson 上查找缩放距离