我有一小部分数据,我想检查一下我的值是否存在于数组中。
这是我的console.log(astar)中的数据的样子;
我的尝试是:
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;效率最高 - 因此当它在数组中找到时会被绘制
答案 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);
}
}
}
}