-1

小さなデータの配列があり、チェックしている値が配列に一緒に存在するかどうかを確認したいと思います。

これは私のconsole.log(astar)からのデータがどのように見えるかです。

http://i.imgur.com/PqzG7.jpg

私の試みは:

 console.log(astar); // display array info
     for (i=0; i < 50; i++){    
        for (j=0; j < 50; j++){ 
        if( i in astar && j in astar[i] ){
               abposx = getx(i);
               abposy = gety(j);
        ctx.fillStyle = "#000";
        ctx.fillRect (abposx,abposy,10,10);             
    }   

アイデアは、[0] [1]の位置を持つ「内部配列」であり、それらの「いずれか」が[0]==iおよび[1]==jであるかどうかを確認しようとしています。

正しく、最も効率的に機能するように変更するにはどうすればよいですか?配列で見つかったときに描画されるようにします

4

2 に答える 2

2

あなたが現在していることは同等です

for (i=0; i < astar.length; i++)
    for (j=0; j < astar[i].length; j++) {
        abposx = getx(i);
        abposy = gety(j);
        ctx.fillStyle = "#000";
        ctx.fillRect(abposx,abposy,10,10);
    }

あなたが望むかもしれません:

for (i=0; i < astar.length; i++) {
    if (astar[i][0] > 50 || astar[i][1] > 50)
        continue;
    abposx = getx(astar[i][0]);
    abposy = gety(astar[i][1]);
    ctx.fillStyle = "#000";
    ctx.fillRect(abposx,abposy,10,10);
}

すべての座標をループすることは非常に非効率的であり、astarで検索するために3番目のループが必要になります。astarをループして、取得できるものをペイントすることをお勧めします。

正しい3ループコードは次のようになります。

for (i=0; i < 50; i++)
    for (j=0; j < 50; j++)
        if (astar.some(function(item) {
            return item[0] == i && item[1] == j;
        }) {
            abposx = getx(i);
            abposy = gety(j);
            ctx.fillStyle = "#000";
            ctx.fillRect(abposx,abposy,10,10);
        }

some()は配列をループし、項目が条件関数に一致する場合はtrueを返します。これはbfavarettoによって投稿された拡張バージョンと同じです)。結果としてO(n ^ 2.5)のパフォーマンスが得られます。

于 2012-04-19T00:01:45.590 に答える
1

配列値と何を比較したいかは明確ではありません。あなたが持っているのは他の配列を含む配列であり、それぞれの中には2つのアイテムしかありません。次のようにループできます。

for(var i=0; i<astar.length; i++) {
    console.log("Array " + i + " contains values " + astar[i][0] + " and " + astar[i][1]);
}

アップデート

私はまだそれを取得するかどうかはわかりませんが、あなたはこれを探しているかもしれません:

for (i=0; i < 50; i++){    
    for (j=0; j < 50; j++){ 
         for(var k=0; k<astar.length; k++) {
              if(astar[k][0] == i && astar[k][1] == j) {
                    abposx = getx(i);
                    abposy = gety(j);
                    ctx.fillStyle = "#000";
                    ctx.fillRect (abposx,abposy,10,10);
                }
          }
     }
} 
于 2012-04-18T23:59:13.797 に答える