如何从另一个2d数组中提取二维数组区域

时间:2015-07-21 18:08:36

标签: javascript multidimensional-array

我试图想出一种从二维数组中切出一个二维数组部分的方法。

我正在寻找一种从坐标位置(4,5)到(7,10)创建另一个2d数组的有效方法。您在阵列中看到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];
            }
        }
    }
}

5 个答案:

答案 0 :(得分:1)

我不确定我理解坐标(4,5) to (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]);

示例:http://jsfiddle.net/cvxs05qo/1/

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

答案 1 :(得分:1)

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

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

请记住,您的两个坐标空间不需要任何额外的转换,这意味着在一个空间中的任何步骤,意味着在另一个空间中的相同步骤。因此,除了翻译之外,您不需要摆弄数据。

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

答案 2 :(得分:0)

在我的头顶,你可以做这样的事情:

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

答案 3 :(得分:0)

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

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(topLeftCorner.y,bottomRightCorner.y);
for(i=0;i<temp.length;i++){
  temp[i]=temp[i].slice(topLeftCorner.x,bottomRightCorner.x);
}


console.log(JSON.stringify(temp));
console.log(JSON.stringify(successfulCropOfArray));

答案 4 :(得分:0)

简单for 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]
]
*/