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

問題は、$.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 に答える
1

あなたが抱えている問題は、CSV データの使用法とは関係なく、データが非同期で読み込まれているという事実だと思います。

ファイルをロードするために 2 つの $.get() リクエストを実行していますが、ファイルのダウンロードには時間がかかります。ブラウザは、残りのコードを続行する前に、それらが終了するのを待ちません。

したがって、配列console.log(nodedate)内にデータが存在する前に実行される可能性があります。nodes

これを処理する簡単な方法は、最初の GET リクエストが完了するようにコールバック関数をスタックすることです -> 2 番目の GET リクエストを実行します -> 最後に処理コードを実行します。

このコードの再編成を確認してください: http://jsfiddle.net/Vr7sw/

(ライブラリをロードしていないため、Google マップの行を削除しました)

于 2013-09-24T04:20:42.730 に答える