[英]Creating 2d array from section of other 2d array Javascript
我正在尝试剪切由x, y
和w, h
指定的二维数组的一部分。 我试图切割的数组的一个例子是
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)
我想要的 output 将是
var retarr = [
['0', 'f', 's', 'g'],
['e', '0', 'v', 'a'],
]
到目前为止,我可以切割部分并成功返回一个新数组,但前提是我的W idth 和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
可以提取 arrays 的位。 首先拉出 Y -> Y + H 处的行。接下来,使用 map() 到 go 穿过每个行,将每个行切成 X -> X + W 的列。
您需要添加安全防护装置以避免超出 arrays 的尺寸或形状。
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
掉不需要的行并使用map
和slice
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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.