裁剪二维数组

时间:2015-10-27 07:13:33

标签: javascript arrays

我有一个由0和1组成的二维数组。 我需要'裁剪'数组,因此没有行/列只有0。

这就是我创建数组的方式。

var image = [];
for (y = 0; y < height; y++) 
{
    image[y] = [];
}

数组的图像示例。 enter image description here

这就是我需要裁剪的数组。 enter image description here

1 个答案:

答案 0 :(得分:0)

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

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

清理行后,你会对cols执行相同的操作,并使用相同的算法,使用一个函数将每个cols作为数组。

这是完成工作的完整示例:

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);