2012-04-18 62 views
-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 ] ==我和[1] == j如果是這樣=真。

我應該如何改變它正確&最高效地工作 - 這樣,當它在陣列

+0

你是什麼意思與「在陣列中一起存在」? – Bergi 2012-04-19 00:02:48

+0

因此,基本上檢查是否有一個內部數組[0] == i && [1] == j – Sir 2012-04-19 00:03:17

回答

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。更好地循環通過astar並繪製你可以得到的東西。

正確的三環路碼本來:

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,它等於extended version posted by bfavaretto)。導致O(n^2.5)的性能...

+0

是的,但那主要是我可憐的嘗試:P im試圖看看內部數組是否有匹配的值[0] [1]到i和j。 – Sir 2012-04-19 00:02:51

+0

循環索引與astar數組中的值匹配? – Bergi 2012-04-19 00:08:33

+0

好,如果你看到我張貼的圖像 - 注意第一個內部數組[0] = 10 [1] = 10 那麼然後在我的循環即時檢查是否存在這樣的組合存在任何這些數組,如果是這樣它等於真實並因此而畫。 – Sir 2012-04-19 00:11:55

1

要與數組值進行比較是什麼目前尚不清楚被找到,也會借鑑。你擁有的是一個包含其他數組的數組,每個數組裏面只有兩個項目。您可以循環像這樣:

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

UPDATE

我仍然不知道我得到它,但你可能會尋找這樣的:

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); 
       } 
      } 
    } 
} 
+0

我基本上檢查是否有[0] [1]位置的第二級數組的值與我的i和j匹配循環。 – Sir 2012-04-19 00:02:05

+0

是的,我也認爲他正在尋找。但你忘了提到不要使用這個「解決方案」:-) – Bergi 2012-04-19 00:22:26