2012-04-18 66 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