1

私はjavascriptを初めて使用しますが、基本的に配列を作成してプロット変数に渡すことができるように、コードをループする方法を理解するのに苦労しています。

どこから始めたらいいのかよくわかりません。現在、最初のデータセット(dataOne)を取得し、それをプロット変数に入れることができるようにフォーマットするコードのチャンクがあります。基本的に、他のデータセットに対してさらに3回実行する必要があります。何らかの方法でループするexample.getDataSets関数を含めることを望んでいます。

これを行う良い方法はありますか?

これが私のコードです:

script.js

var example = {};

example.data = {
    dataOne: {data: [{"date":1333238400000,"data":23},{"date":1333324800000,"data":37},{"date":1333411200000,"data":49},{"date":1333497600000,"data":54},{"date":1333584000000,"data":30},{"date":1333670400000,"data":19},{"date":1333756800000,"data":15},{"date":1333843200000,"data":19},{"date":1333929600000,"data":145}]},
    dataTwo: {data: [{"date":1335830400000,"data":63},{"date":1335916800000,"data":77},{"date":1336003200000,"data":66}]},
    dataThree: {data: [{"date":1341100800000,"data":24},{"date":1341187200000,"data":50},{"date":1341273600000,"data":43},{"date":1341360000000,"data":39},{"date":1341446400000,"data":56},{"date":1341532800000,"data":66}]},
    dataFour: {data: [{"date":1333238400000,"data":71},{"date":1333324800000,"data":46},{"date":1333411200000,"data":66},{"date":1333497600000,"data":73},{"date":1333584000000,"data":105},{"date":1333670400000,"data":84}]}
}

example.getDataSets = function(){
    return ['dataOne', 'dataTwo', 'dataThree', 'dataFour']
}

example.getSeries = function(month){
    return example.data[month]
}

example.processData = function(data){
    var newData = []
    for(var i = 0; i < data.length; i++){
        newData.push([data[i].date, data[i].data])
    };
    return newData;
}

HTMLページの私のスクリプト:

$.getScript("script.js")
    .done(function() {

    var b = example.getSeries('dataOne');
    var d = example.processData(b.data);
    // first correct the timestamps - they are recorded as the daily
    // midnights in UTC+0100, but Flot always displays dates in UTC
    // so we have to add one hour to hit the midnights in the plot
    for (var i = 0; i < d.length; ++i)
      d[i][0] += 60 * 60 * 1000;

    var plot = $.plot($("#placeholder"), [d] , options);

どんな提案でも大歓迎です!

4

3 に答える 3

0

から返された値もループし.getDataSetsます。

var sets = example.getDataSets(), set_i = 0, // get list of sets
    b = {}, d = [], i = 0, plot; // set-up vars
for(; set_i < sets.length; set_i++){ // loop over each set
    b = example.getSeries( sets[ set_i ] ); // get your set
    d = example.processData(b.data);
    for (i = 0; i < d.length; ++i)
      d[i][0] += 60 * 60 * 1000;

    plot = $.plot($("#placeholder"), [d] , options);
    // ... etc with plot
}

プロットする前にそれらをすべて 1 つの配列に入れたい場合は、別の配列でconcatを使用し(それか何かを呼び出します)、次に set ループで を 使用し、ループの外側でプロットします。d_totald_total = d_total.concat( d );

于 2012-09-20T02:12:43.837 に答える
0

それぞれを処理したいと思います

var b = example.getSeries(X);

ここで、X は「dataOne」、「dataTwo」、「dataThree」、「dataFour」ですか?

もしそうなら、あなたは次のようなものを探しているでしょう:

// see below for where example.ordering is suggested
for (var i in example.ordered) {
  var month = example.ordered[i];
  var b = example.getSeries(month);
  var d = example.processData(b.data);
  ... further processing with month, b, d.
}

getDataSets() は、適切な順序で「月」を生成するのに適しています。私の唯一の懸念は、月のリストが 2 か所にあることです。example.data から「月名」を抽出できず、それらが同じ順序であると期待できないため、月の順序付けには配列が必要です (キーはハッシュのために基本的にランダムに格納されます)。

資格は、キーがソート可能である場合ですが、ここにあるキーはそうではありません。もちろん、同じソースから構造体のペアを作成する場合は、関連付けられた配列 (example.data オブジェクト) にデータを格納し、順序付けが一般的で受け入れられることを示す別の配列を使用します。理想的には、これら 2 つをさらに別のオブジェクトにペアにして、チームとして処理できるようにします。

順序付けられた月の配列は関数で文字通り「失われる」ため、次のようなものを追加することをお勧めします

example.ordering = [ ..... ]

さらに良いことに、ハッシュに入れられたのと同じ順序で月をそのリストの最後にプッシュします。ヘルパー関数を使用してデータを保存します。

example.ordering = [];  // initially empty
example.storeSet = function (month, dataList) {
    example.ordering.push(month);
    example.data[month] = { data : dataList };
}

....
// now store the data
example.storeSet('dataOne',   [{"date":1333238400000,"data":23}, ....]);
example.storeSet('dataTwo',   [{"date":1335830400000,"data":63}, ....]);
example.storeSet('dataThree', [{"date":1341100800000,"data":24}, ....]);
example.storeSet('dataFour',  [{"date":1333238400000,"data":71}, ....]);

もちろん、私のコードはテストされていません (もちろん!) ですが、正しいように見えます。

于 2012-09-20T02:17:04.863 に答える
-1

私は初心者であり、座って見ても答えが見つからないときのあなたの欲求不満を理解しています. ただし、あなたが探していると思うのは次のようなものです。

for (example.data=dataOne;example.data<dataFour;example.data=example.data+increment)
{
    code to be executed
}

または再帰的にも可能ですが、私はそれが得意ではありませんが、以下は標準的な例です

function recurs(p1) {
    p1--;
    if (p1 < 0) return // exit condition
        setTimeout("recurs("+p1+")",1);
}
于 2012-09-20T02:09:26.787 に答える