从其他2d数组Javascript的部分创建2d数组



我正在尝试剪切由x, yw, h指定的2d数组的一部分。我试图切割的阵列的一个例子是


var arr = [
['0', '1', 'd', 'a', '1', '1'],
['0', 's', '0', 'f', 's', 'g'],
['b', 'x', 'e', '0', 'v', 'a'],
['a', 'e', 'n', '0', 'z', 'm'],
['b', 'x', 'e', '0', 'v', 'a'],
];

所以如果我打电话给snapshot(2, 1, 4, 2)我想要的输出是

var retarr = [
['0', 'f', 's', 'g'],
['e', '0', 'v', 'a'],
]

到目前为止,我可以成功地切割部分并返回一个新数组,但前提是我的W宽度和H八个相等。

snapshot(x, y, w, h){
var retgrid = new Grid(w, h); 
var startX = x;
var startY = y;
var endX = x + w;
var endY = y + h;
console.log(`x: ${x} y: ${y}`)
console.log(`w: ${w} h: ${h}`)
for(var i = startY; i < endY; i++){
for(var j = startX; j < endX; j++){
// console.log(retgrid)
retgrid[j - startX][i - startY] = this.grid[j][i]
}
}
console.log(retgrid)
return retgrid;
}

一个不断发生的错误是game.js:316 Uncaught TypeError: Cannot set property '-1' of undefined

我已经做了一段时间了。我知道这可能只是一些简单的逻辑错误,但出于某种原因,我无法准确定位。有人能发现我做错了什么吗?

使用.slice可以提取数组的位。首先拉出Y->Y+H。接下来,使用map()遍历其中的每一个,将每一个从X->X+W.

您需要添加安全防护装置,以避免超出阵列的大小或形状。

var arr = [
['0', '1', 'd', 'a', '1', '1'],
['0', 's', '0', 'f', 's', 'g'],
['b', 'x', 'e', '0', 'v', 'a'],
['a', 'e', 'n', '0', 'z', 'm'],
['b', 'x', 'e', '0', 'v', 'a'],
];
console.log(snapshot(2, 1, 4, 2));
function snapshot(x, y, w, h) {
return arr.slice(y, y + h).map(a => a.slice(x, x + w))
}

将此任务分解为两个步骤可以大大简化:

步骤1:提取所需的完整行

步骤2:从提取的行中提取所需的列。

const arr = [
['0', '1', 'd', 'a', '1', '1'],
['0', 's', '0', 'f', 's', 'g'],
['b', 'x', 'e', '0', 'v', 'a'],
['a', 'e', 'n', '0', 'z', 'm'],
['b', 'x', 'e', '0', 'v', 'a'],
];
function snapshot (array, colStart, rowStart, cols, rows) {

// slice out the rows
const fullRows = array.slice(rowStart, rowStart+rows);
console.log('fullRows:', fullRows);

// cut down the rows
const cutRows = fullRows.map(row => row.slice(colStart, colStart+cols));
return cutRows;
}
const result = snapshot(arr, 2, 1, 4, 2);
console.log('result:', result);

第一个filter排除不需要的行并使用mapslice

const snapshot = (arr, x, y, w, h) =>
arr
.filter((_, i) => i >= y && i < y + h)
.map((items) => items.slice(x, x + w));
var arr = [
["0", "1", "d", "a", "1", "1"],
["0", "s", "0", "f", "s", "g"],
["b", "x", "e", "0", "v", "a"],
["a", "e", "n", "0", "z", "m"],
["b", "x", "e", "0", "v", "a"],
];
console.log(snapshot(arr, 2, 1, 4, 2));

最新更新