Javascript 采访问题-寻找坐标2d数组
有一个每个像素都是白色/黑色的图像。图像是一个简单的2D数组(0=黑色,1=白色)。你得到的图像在白色背景上有一个单独的黑色矩形。您的目标是找到这个矩形并返回其坐标 如何遍历2d数组?Javascript 采访问题-寻找坐标2d数组,javascript,arrays,2d,Javascript,Arrays,2d,有一个每个像素都是白色/黑色的图像。图像是一个简单的2D数组(0=黑色,1=白色)。你得到的图像在白色背景上有一个单独的黑色矩形。您的目标是找到这个矩形并返回其坐标 如何遍历2d数组?var image=[ var image = [ [1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 1], [1, 1, 1, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1] ]; [1
var image=[
var image = [
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 1],
[1, 1, 1, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1]
];
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 1],
[1, 1, 1, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1]
];
对于(变量i=0;i
第一个索引将返回第一行,依此类推
随后,您可以像正常(1D)阵列一样访问行中的每个像素。我不确定您是否只需要知道左上角坐标,或者矩形的宽度和高度。我将在我的回答中包括这两个方面 要查找左上角,我将使用以下函数:
var image = [
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 1],
[1, 1, 1, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1]
];
for (var i = 0; i < image.length; i++) {
// row is a 1D array
var row = image[i];
}
总而言之:
function getWidthOfRectangle(image, topLeftCorner) {
var x = topLeftCorner.x;
while (image[x][topLeftCorner.y] == 0) {
x++;
}
//Now x is the x-coordinate of the first white (1) pixel found
//Therefore subtract 1 from it to find the last black (0) pixel found
x--;
return x - topLeftCorner.x;
}
function getHeightOfRectangle(image, topLeftCorner) {
var y = topLeftCorner.y;
while (image[topLeftCorner.x][y] == 0) {
y++;
}
//Now y is the y-coordinate of the first white (1) pixel found
//Therefore subtract 1 from it to find the last black (0) pixel found
y--;
return y - topLeftCorner.y;
}
希望这有帮助。这是我的第一个答案,所以如果我犯了错误,请随时在评论中告诉我。我已经提供了解决方案。 基本上你需要找出这个二维数组的长度。 然后从第一个元素开始遍历它,直到找到矩形左上角的第一个零元素
var topLeftCorner = findTopLeftCorner(image);
var rectangle = {
x: topLeftCorner.x,
y: topLeftCorner.y,
width: getWidthOfRectangle(image, topLeftCorner),
height: getHeightOfRectangle(image, topLeftCorner)
};
用于(i=0;我只是回答面试问题好吗?一路解释?还是我应该像家庭作业一样推迟……嵌套Array.prototype.findIndex
应该有助于找到左上角。正常循环应该足以找到高度和宽度。@IrkenInvader:如果可以,请回答这个问题,我已经尝试使用js的indexof,但不是reall我明白了,所以我知道在什么时候我需要得到帮助,`-斯塔科沃夫流到处都是这样的人,他们准备投反对票并炫耀自己是极客,我认为真正极客的人只是想帮助初学者,而不是讽刺地留下评论。Stack Overflow也充满了新用户,他们在家庭作业方面寻求帮助,这太可怕了从帮助中心直接引述:要求家庭作业帮助的问题必须包括你迄今为止为解决问题所做工作的总结,以及你解决问题的困难的描述。而且,我对你投了反对票,但我打赌你还会有更多的问题。看起来你只是在最后回答问题,而不是在上下文中我的目的只是演示如何遍历2D数组。我不想向他提供答案。我确信他在知道如何遍历数组后能够得到答案。为我糟糕的答案道歉。你真的这么认为吗?困难的部分是识别嵌入的矩形在哪里,循环索引在哪里琐碎。事实上,在知道如何遍历2D数组之后,我做到了:(这可能不是最好的/优化的方法(我想到的),但它完成了任务。感谢Jeremy,我感谢你的帮助,它确实给了我一些关于如何遍历的见解。另一个解释-我想与任何感兴趣的人分享的另一个角度。第一个答案是肯定的Jeremy,+1!坐标更容易找到:获取平面索引var flatIndex=Array.prototype.concat.apply([],image).indexOf(0);
。然后获取x坐标:var x=flatIndex%image[0]。长度);
和y坐标:var y=Math.floor(flatIndex/image[0]。长度);
A加工。
var topLeftCorner = findTopLeftCorner(image);
var rectangle = {
x: topLeftCorner.x,
y: topLeftCorner.y,
width: getWidthOfRectangle(image, topLeftCorner),
height: getHeightOfRectangle(image, topLeftCorner)
};
for(i=0;i<dim[0];i++)
for(j=0;j<dim[1];j++){
if(!image[i][j]) {
document.getElementById('top-left').innerHTML = i+' '+j;
return;
}
}