1

配列をリセットしようとすると、非常に奇妙な動作が発生します。例えば:

data.length=0;

data は配列です。ここでは関連するコードのみを含めようとしますが、基本的には、プログラムの反復ごとに配列に更新された値を入力し、その配列を別の関数で使用します。しかし、配列をリセットすると、関数は最初の反復で値を取得するように見えますが、その後は値を取得しません。

ただし、配列をリセットしないと、関数は値だけでなく古い値も取得します。新しい更新された値のみが必要なため、これは必要ありません。これはコード スニペットです。

      var buffer = [['1',[0]],['2',[0]],['3',[0]],['4',[0]]];
      var dataset = [];

         ws.onmessage = function(evt){ 
         dataset.length=0;
         var distances = JSON.parse(evt.data);

         console.log(distances);

            for(var i=0; i<buffer.length; i++) {
                if(buffer[i][0] == distances.miles) {
                    buffer[i][1][0]++;
                    }
                //console.log(buffer);

                dataset.push(buffer[i][1][0]);
                draw();
                //console.log(dataset); 

            }

    }

この関数は、データセット配列を使用してグラフを再描画します。

ここではシンプルにしようとしましたが、完全な機能はこちらにあります。

この予期しない動作の原因は何なのか、私には本当にわかりません。

編集:

console.log(dataset) は新しく更新された値を示していますが、どういうわけか dataset.length=0; 更新された配列が draw() 関数で使用されるのを妨げています。配列をリセットしなくても、配列は draw() 関数で使用できます。

編集:

配列をリセットするのではなく、最後の 4 つの要素を取得して新しい配列に入れてから draw() に送信しようとしましたが、それでも同じ奇妙な動作です。

            x = dataset.slice(-4);
            console.log(x);
            draw();

しかし、私がそれをしないか、配列をクリアしないと、draw() は「間違った」チャートをレンダリングします。何が悪いのかわかりません。

問題はどういうわけか配列のリセットにあるようであり、このため draw() 関数が最初の反復で一度だけ呼び出されるように見えることを意味します。

助けてください

4

2 に答える 2

2

設定する必要はまったくありませんlength。すべての値のリストをクリアするには、空のリストに設定するだけです。

dataset = [];
于 2012-12-10T12:50:44.730 に答える
1

あなたのコードを見ると、よくわかりませんが、なぜあなたは持っているのdatasetですか? あなたはそれから何も読み取らず、配列を介して毎回それをクリアしたいと言います。

次のようなことをするという意味ですか:

for(var i=0; i<buffer.length; i++) {
    if(buffer[i][0] == distances.miles) {
        buffer[i][1][0]++;
    }
    dataset.push(buffer[i][1][0]);
}
draw(dataset); // draw outside the loop, using dataset.
于 2012-12-10T12:46:56.610 に答える