0

次のようなオブジェクトの配列があります。

var chartData = [{count: 0, idTag: "24"}
                 {count: 0, idTag: "25"}
                 {count: 0, idTag: "26"}]

私のコードはいくつかの作業を行い、数値 ( totalValue) を生成します。totalValueに一致する場合idTag、そのcount値が 1 増加します。

for (i=0; i<timesFlipped; i++) {
    totalValue = runTrial();
    for (j=0; j<chartData.length; j++) {
        if (chartData[j].idTag === totalValue) {
            chartData[j].count += 1;
            break;
        }
    }
}

これは単純な例ですがchartData、数十個のオブジェクトを保持でき、数十timesFlipped万回の反復になる可能性があります。

countこれは、値の一致に基づいて値を変更する最良の方法idTagですか? idTagオブジェクトの配列全体を反復せずに、正しい値を持つ配列のインデックスを見つける方法はありますか?

より多くのコンテキストが必要な場合は、私が取り組んでいるページを次に示します: http://blue.butler.edu/~aazman/coupling/


アップデート:

すべての提案をありがとう。私は自分が見たものに基づいて、独自のソリューションを形成しました。私のソリューションに私を導いたプロジェクトについてのもう少しの背景:

  • idTagの長さchartDataと最小値は、送信をクリックしたときのユーザー入力に基づいて計算されます。
  • minとが計算されるとlength(したがって、最大の idTag がわかります)、chartData繰り返し初期化されます。

var min = 23-5*numNickel-numPenny; //numNickel & numPenny are the user inputs

var length = 5*(2*numNickel+1)+2*numPenny;

var tempTag = min;

for (j=0;j<length;j++) {

chartData[j] = {count: 0, idTag = tempTag};

tempTag++;

}

  • ゲームのルールに特有の理由により、idTag 値 (いくつあっても) は対称的に中心に配置されますidTag:25(例: idTags = {24, 25, 26} または idTags = {20,21,22,23,24,25, 26,27,28,29,30}. の長さに関係なく、長chartDataさは常に奇数であり、idTag:25常に[(chartData.length-1)/2]' 番目のインデックスになります。

したがって、 の idTagschartDataが で{20,21,22,23,24,25,26,27,28,29,30}あり、runTrial()を与える場合totalValue = 22idTag:22常に index になります(totalValue - min)

そこで、chartData の初期化とカウントの増加方法を次のように変更しました。

for (j=0; j<length; j++) {
    chartData[j] = {count: 0};  //based on what I'm doing with chartData next, I need each index to still be an object
}

for (i=0; i<timesFlipped; i++) {
    totalValue = runTrial();
    var index = totalValue - min;
    chartData[index].count++;
}

だから、あなたの助けに感謝します:)

4

4 に答える 4

0

chartData の構造を自由に変更できるのであれば、配列ではなくハッシュにしてみませんか?

var chartData = {24: 0,
                 25: 0,
                 26: 0};

そして、ループは次のようになります

for (i=0; i<timesFlipped; i++) {
    chartData[runTrial()]++;        
}
于 2012-07-05T16:18:17.023 に答える
0

「idTag」値をキーとして、そのカウントを値として中間ハッシュを維持し、for ループで操作を実行し、for ループが完了したら、中間ハッシュから charData を生成します。

于 2012-07-04T20:55:39.297 に答える
0

クライアント側のデータベース ストレージ メカニズムを使用することをお勧めします。クエリにカウントを任せてください。

これにより、より監視しやすくなり、さまざまなウイルススキャナーからのメノリー警告が減り、さらに毎回データを再取得する必要がなくなります.

別のアプローチは、サーバー側のデータベースを使用し、必要な値を json 経由で取得することです。

ブラウザのフリーズを防ぐもう 1 つの方法は、ループを Webworker で実行することです。これにより、ループがスレッドになり、ブラウザがロックされなくなります。

于 2012-07-04T20:48:40.963 に答える
0

次のように、chartData 配列内のオブジェクトを指す別のオブジェクトを作成できます。

var idToChart = {};
for (var i = 0; i < chartData.length; i++) {
    var currChart = chartData[i];
    idToChart[currChart.idTag] = currChart;
}

そして使用する

var chart = idToChart[totalValue];
chart.count++;

オブジェクトのプロパティへのアクセスは、配列を毎回ループするよりも高速です。

@zerkms が指摘したように、配列が でソートされている場合、idtag別のオブジェクトを作成する必要さえなく、配列に直接アクセスできます。理想的には、または並べ替えられた配列形式chartDataで開始します。idToChart

于 2012-07-04T20:52:34.897 に答える