Javascript 裁剪二维阵列
我有一个由0和1组成的二维数组。 我需要“裁剪”数组,这样就不会有只包含0的行/列 这就是我创建数组的方式Javascript 裁剪二维阵列,javascript,arrays,Javascript,Arrays,我有一个由0和1组成的二维数组。 我需要“裁剪”数组,这样就不会有只包含0的行/列 这就是我创建数组的方式 var image = []; for (y = 0; y < height; y++) { image[y] = []; } var image=[]; 对于(y=0;y
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末尾的行和列工作得非常好,我已经用类似的方式实现了它。标记为答案!