检查数组中的“存在”数据?

时间:2012-04-18 23:53:01

标签: javascript

我有一小部分数据,我想检查一下我的值是否存在于数组中。

这是我的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如果是这样的话。 / p>

我应该如何改变它以正常工作&amp;效率最高 - 因此当它在数组中找到时会被绘制

2 个答案:

答案 0 :(得分: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)......

答案 1 :(得分:1)

目前尚不清楚您想要与数组值进行比较。你拥有的是一个包含其他数组的数组,每个数组里面只有两个项目。你可以像这样循环:

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