2

我正在阅读一些关于 JS 数组的教程,我有一个问题。

假设我像这样创建一个二维数组:

var arr = new Array(10);

for (var i = 0; i < arr.length; i++) {
    arr[i] = new Array(10);
}

如何设置二维数组的最大参数,以便在将值附加到某些单元格时被拒绝?

例如,

arr[1][2] = "one";
arr[5][15] = "two";

arr[5][15]超出了创建数组的代码中设置的参数,但仍会创建并传递到数组中,而此时不应如此。

阅读评论后 - 下面的新代码:

let grid = []

const createGrid = (x) => {

    grid = new Array(x);

    for (var i = 0; i < grid.length; i++) {
        grid[i] = new Array(10);
    }
    if(Object.seal) { 
        Object.seal(grid);
    }
}

createGrid(10);

grid[1][2] = "one";
grid[5][15] = "two";

console.log(grid);

这不起作用,但是当将第一个值设置为大于网格 ( grid[15][5]) 的设置长度时,它会被拒绝,但在设置为 时不会grid[5][15]

4

2 回答 2

0

您可以为此使用代理

const handler = {
  set(target, prop, value, receiver){
    if (prop > target.length - 1)
      throw new RangeError()

    return Reflect.set(...arguments)
  }
}

const createDimension = size => new Proxy(new Array(size), handler)
const grid = createDimension(10)

for(i=0;i<10;i++){
  grid[i] = createDimension(10)
}

grid[2][0] = 'foo'
console.log(grid)

// Should throw range error
grid[2][12] = 'foo'
console.log(grid)
于 2019-06-19T11:25:41.483 回答
0

您只密封了根数组,但忘记为子数组这样做。这是你应该做的:

let grid = []

const createGrid = (x) => {

    grid = new Array(x);

    for (var i = 0; i < grid.length; i++) {
        grid[i] = new Array(10);
    }
    if(Object.seal) { 
        Object.seal(grid);
        grid.forEach(Object.seal) // <----- you forgot this
        // the above line is the shorter version of this:
        // grid.forEach(childGrid => Object.seal(childGrid))
        
    }
}

createGrid(10);

grid[1][2] = "one";
grid[5][15] = "two";

console.log(grid);

于 2019-06-19T11:31:47.820 回答