Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从另一个二维阵列中提取二维阵列区域_Javascript_Multidimensional Array - Fatal编程技术网

Javascript 如何从另一个二维阵列中提取二维阵列区域

Javascript 如何从另一个二维阵列中提取二维阵列区域,javascript,multidimensional-array,Javascript,Multidimensional Array,我正试图找出一种方法,从2d数组中分割出2d数组部分 我正在寻找一种从坐标位置(4,5)到(7,10)创建另一个二维阵列的有效方法。阵列中显示为1s的区域 var arr = [ [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0], [0,0,0,0,0,

我正试图找出一种方法,从2d数组中分割出2d数组部分

我正在寻找一种从坐标位置(4,5)到(7,10)创建另一个二维阵列的有效方法。阵列中显示为1s的区域

var arr = [
    [0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,1,1,1,1,1,0],
    [0,0,0,0,0,1,1,1,1,1,0],
    [0,0,0,0,0,1,1,1,1,1,0],
    [0,0,0,0,0,0,0,0,0,0,0],
];

var successfulCropOfArray = [
    [1,1,1,1,1],
    [1,1,1,1,1],
    [1,1,1,1,1]
];
有没有人可以用伪代码来说明我是如何做到这一点的。以下是我尝试过但几乎没有成功的方法:

var slicedMap = Create2DArray(visibleMap);
var topLeftCorner = {
    x: 4,
    y: 5
};
var bottomRightCorner = {
    x: 10,
    y: 7
};

for(var left = topLeftCorner.x;left<bottomRightCorner.x;left++) {   //from left to right scan
    for(var top = bottomRightCorner.y-visibleMap;top>bottomRightCorner.y;top--) {
        for(var slicedX = 0;slicedX<slicedMap.length;slicedX++) {
            for(var slicedY = 0;slicedY<slicedMap.length;slicedY++) {
                slicedMap[slicedY][slicedX] = rooms[newroom].map[bottom][left];
            }
        }
    }
}
var slicedMap=Create2DArray(visibleMap);
var topLeftCorner={
x:4,
y:5
};
var bottomRightCorner={
x:10,
y:7
};
对于(var left=topLeftCorner.x;leftbottomRightCorner.y;top--){

对于(var slicedX=0;slicedX,我不确定我是否理解坐标
(4,5)到(8,7)
将如何给出该结果,但下面是一个使用
[x1,y1],[x2,y2]
语法的示例:

function getSlice(upper, lower) {
    // grab all the rows within our bounds
    return arr.slice(upper[1], lower[1])
        // and then map each row to the columns in our bounds
        .map(function(row) {
           return row.slice(upper[0], lower[0]); 
        });
}

// usage: getSlice([x1, y1], [x2, y2]);
getSlice([5,4], [10,7]);
例如:



编辑:在第一次尝试时,我意外地将其实现为
[y1,x1],[y2,x2]
,现在已修复。

我将在这里使用一些术语,因为这将有助于您在将来搜索该主题

嵌套循环是不必要的。您应该将左上角视为转换点,因此
(0,0)
在源坐标空间中转换为
(8,7)
。您应用的转换(转换)是从源点减去
(8,7)
向量,即:
(8,7)
-
(8,7)
=
(0,0)
。换言之,从每个
x
值中减去
8
,从每个
y
值中减去
7
,即可设置

记住,你的两个坐标空间不需要任何额外的变换,这意味着一个空间中的任何右移都意味着另一个空间中的右移。因此,除了平移,你不需要处理数据


源矩形的大小定义了循环的边界,而不是它所在的坐标空间的大小;这是无关的(数组有多大并不重要,只要它们不小于您正在搜索的区域)。

在我的脑海中,您可以这样做:

    var numberForArray1 = 0;
    var numberForArray2 = 0;

     for (var i = 4; i < 8;i ++)
     {

         for (var j = 5; j < 8; j++)
        {
         successfulCropOfArray[numberForArray1,numberForArray2] = arr[i,j];
         numberForArray1++;


        }

        numberForArray2++; 
        }
var numberForArray1=0;
var numberForArray2=0;
对于(变量i=4;i<8;i++)
{
对于(var j=5;j<8;j++)
{
成功的cropofarray[numberForArray1,numberForArray2]=arr[i,j];
numberForArray1++;
}
numberForArray2++;
}

我不知道你是如何从坐标中得到结果的,但是使用你提到的概念,我会使用
切片

function slice2d(arr, top, left, bottom, right) {
    var a = new Array(bottom - top), i;
    for (i = top; i < bottom; ++i)
        a[i - top] = arr[i].slice(left, right);
    return a;
}

slice2d(arr, 4, 5, 7, 10);
/*
[
    [1,1,1,1,1],
    [1,1,1,1,1],
    [1,1,1,1,1]
]
*/
var-arr=[
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,1,1,1,1,0],
[0,0,0,0,0,1,1,1,1,1,0],
[0,0,0,0,0,1,1,1,1,1,0],
[0,0,0,0,0,0,0,0,0,0,0],
];
var successfulCropOfArray=[
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1]
];
var topLeftCorner={
x:5,
y:4
};
var bottomRightCorner={
x:10,
y:7
};
var temp=arr.slice(上左角.y,下右角.y);

对于(i=0;iSimple
for
with
Array.prototype.slice

function slice2d(arr, top, left, bottom, right) {
    var a = new Array(bottom - top), i;
    for (i = top; i < bottom; ++i)
        a[i - top] = arr[i].slice(left, right);
    return a;
}

slice2d(arr, 4, 5, 7, 10);
/*
[
    [1,1,1,1,1],
    [1,1,1,1,1],
    [1,1,1,1,1]
]
*/
函数切片2D(arr、顶部、左侧、底部、右侧){
var a=新数组(底部-顶部),i;
对于(i=顶部;i<底部;++i)
a[i-top]=arr[i]。切片(左、右);
返回a;
}
切片2D(arr,4,5,7,10);
/*
[
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1]
]
*/

我没有获得成功的收成。我只是展示了期望的结果。改变了坐标。问题写得很匆忙。