开发者问题收集

从其他二维数组的部分创建二维数组 Javascript

2021-01-25
89

我试图剪切由 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 idth 和 H eight 相等。

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

我已经这样做了一段时间了。我知道这可能只是一些简单的逻辑错误,但出于某种原因,我就是无法确定它。有人能找出我做错的地方吗?

3个回答

使用 .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))
}
Randy Casburn
2021-01-25

这个任务可以大大简化,只需将其分为两个步骤即可:

步骤 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);
terrymorse
2021-01-25

首先 过滤 掉不需要的行,然后使用 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));
Siva Kondapi V
2021-01-25