1

我正在尝试将几个 CSV 文件的内容加载到一个新数组中。CSV 文件具有典型的结构,第一行带有标签,值(字符串和实数)以逗号分隔。这部分代码负责加载数据以供将来与 Google Maps Api 一起使用(目前这不是问题,因为我只卡在加载数据上)。我想要一个结构,我可以通过它的名称来调用一个元素,这var nodedata = {};就是创建它的原因。

所以我完全不明白的是为什么代码的某些部分根本没有被执行?console.log(nodedata);是空的,至少在我的 Firefox 控制台中没有。

这是我对这个问题的尝试 - 到 csv 文件的链接在代码中。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js"></script>
<script src="http://jquery-csv.googlecode.com/files/jquery.csv-0.71.js"></script>
<script type="text/javascript">

var nodes = {};
var generation = {};
var nodedata = {};

$.get('https://dl.dropboxusercontent.com/u/25575808/energy/nodes.csv', function (response) {
    nodes = $.csv.toObjects(response);
    console.log(nodes);
});

$.get('https://dl.dropboxusercontent.com/u/25575808/energy/generation.csv', function (response) {
generation = $.csv.toObjects(response);
console.log(generation);
});


function getGeneration (nodename){
    gen = 0;
    for (var i = 0; i < generation.length; i++) {
    if (generation[i].datetime == "2013-01-01 01:00"){
        if (generation[i].node == nodename){
             gen = gen + Number(generation[i]["output (MW)"])
        }
    }
    }
    return gen;
}


for (var i = 0; i < nodes.length; i++) {
    nodedata[nodes[i].Node] = {
    center: new google.maps.LatLng(nodes[i].Latitude,nodes[i].Longitude),
    nodegen : getGeneration(nodes[i].Node)
    }
}
console.log(nodedata);
4

2 回答 2

1

我相信您遇到的问题与 CSV 数据的使用无关,而是数据正在异步加载的事实。

您正在执行 2 个 $.get() 请求来加载文件,这需要一些时间来下载文件。在继续执行其余代码之前,浏览器不会等待它们完成。

因此,可以在数组中console.log(nodedate)存在任何数据之前执行。nodes

处理这个问题的一个简单方法是堆叠你的回调函数,以便第一个 GET 请求完成 -> 运行第二个 GET 请求 -> 最后,运行处理代码。

查看代码的这种重组:http: //jsfiddle.net/Vr7sw/

(我删除了谷歌地图行,因为我没有加载图书馆)

于 2013-09-24T04:20:42.730 回答
1

问题是,$.get 请求是异步的(请参阅jquery 文档),尝试调用一个函数,进入你的回调主体,如下所示:

function nodesToJson(nodes) {
    for (var i = 0; i < nodes.length; i++) {
        nodedata[nodes[i].Node] = {
        center: new google.maps.LatLng(nodes[node].Latitude,nodes[node].Longitude),
        nodegen : getGeneration(nodes[i].Node)
        }
    }
    console.log(nodedata);
}
$.get('https://dl.dropboxusercontent.com/u/25575808/energy/nodes.csv', function (response) {
    nodes = $.csv.toObjects(response);
    //when the request are ready, process the nodes
    nodesToJson(nodes);
});
于 2013-09-24T04:19:59.980 回答