我正在阅读JS数组的一些教程,我有一个问题。
假设我像这样创建一个二维数组:
var arr = new Array(10);
for (var i = 0; i < arr.length; i++) {
arr[i] = new Array(10);
}
如何设置2d数组的max参数,以便在将值附加到某些单元格时被拒绝?
例如
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]
时,则不会。
答案 0 :(得分:0)
您可以为此使用Proxy:
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)
答案 1 :(得分: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);