Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.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_Arrays - Fatal编程技术网

Javascript 裁剪二维阵列

Javascript 裁剪二维阵列,javascript,arrays,Javascript,Arrays,我有一个由0和1组成的二维数组。 我需要“裁剪”数组,这样就不会有只包含0的行/列 这就是我创建数组的方式 var image = []; for (y = 0; y < height; y++) { image[y] = []; } var image=[]; 对于(y=0;y

我有一个由0和1组成的二维数组。 我需要“裁剪”数组,这样就不会有只包含0的行/列

这就是我创建数组的方式

var image = [];
for (y = 0; y < height; y++) 
{
    image[y] = [];
}
var image=[];
对于(y=0;y<高度;y++)
{
图像[y]=[];
}
数组的图像示例。

这就是我需要裁剪的数组。

首先,您应该通过检测数组中是否充满了零来清理行。 您可以使用
Array.prototype.every
。 例子: 此函数返回数组是否为空。 函数isEmpty(arr){ 返回arr.every(功能(项目){ 退货项目===0; }); }

您可以编写一个算法,从0开始检测每一行,直到有一个非空行。从数组的末尾做同样的事情

var image = [];
for (y = 0; y < height; y++) 
{
    image[y] = [];
}
在清理行之后,对cols执行相同的操作,并使用相同的算法,使用一个函数将每个col作为一个数组

以下是完成此工作的完整示例:

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


function cleanRows(arr) {
    var i=0;
    var j=arr.length-1;

    while(i<arr.length && isEmpty(arr[i])) {
        i++;
    }
    while(j>i && isEmpty(arr[j])) {
        j--;
    }
    return arr.slice(i,j+1);
}

function cleanCols(arr) {
    var i= 0, j=arr[0].length-1;

    while(i<j && isEmpty(getCol(arr,i))) {
        i++;
    }
    while(j>i && isEmpty(getCol(arr,j))) {
        j--;
    }
    j++;

    // clear each line
    return arr.map(function(row) {
        return row.slice(i,j);
    })
}

function getCol(arr,colIndex) {
    return arr.map(function(item) {
        return item[colIndex];
    });
}

function isEmpty(arr) {
    return arr.every(function(item) {
        return item===0;
    });
}

var newArr = cleanRows(arr);
newArr = cleanCols(newArr);

console.log(newArr);
var-arr=[
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,0,1,1,1,0,0,0,0],
[0,0,1,0,1,0,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,0,1,1,1,0,0,1,0],
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0]
];
函数清除行(arr){
var i=0;
var j=arr.length-1;
而(ii&&i是空的(arr[j])){
j--;
}
返回arr.slice(i,j+1);
}
函数cleanCols(arr){
变量i=0,j=arr[0]。长度-1;
而(ii&&i是空的(getCol(arr,j))){
j--;
}
j++;
//清除每一行
返回arr.map(函数(行){
返回行切片(i,j);
})
}
函数getCol(arr、colIndex){
返回arr.map(函数(项){
返回项目[colIndex];
});
}
函数isEmpty(arr){
返回arr.every(功能(项目){
退货项目===0;
});
}
var newArr=洁净行(arr);
newArr=洁净度(newArr);
控制台日志(newArr);

用1查找第一行,第一列用1,这是裁剪的起始行、列,然后向后搜索最后一行用1,最后一列用1,这就是您的cropIt末尾的行和列工作得非常好,我已经用类似的方式实现了它。标记为答案!