如何通过自定义坐标ID实现二维数组元素的读写操作?
问题原因
你遇到的ReferenceError是因为函数调用的返回值是“右值”,无法直接被赋值。当前的square方法返回的是this.chessboard[row][col]的具体值(比如字符串或undefined),而非指向该数组位置的可修改引用,所以你不能像给变量赋值那样直接给它的返回值赋值。
解决方案
以下两种常用方式可实现通过自定义ID读写二维数组元素:
方案1:拆分读写方法(推荐,可读性高)
明确拆分读取与设置操作,分别实现getSquare和setSquare方法:
class Chessboard { constructor() { // 初始化8x8空棋盘示例 this.chessboard = Array.from({ length: 8 }, () => Array(8).fill(null)); } parseSquareToBoard(coordinate) { // 示例:将a1这类坐标转换为数组索引 const colChar = coordinate[0]; const rowNum = coordinate[1]; return { col: colChar.charCodeAt(0) - 'a'.charCodeAt(0), row: 8 - parseInt(rowNum, 10) }; } getSquare(coordinate) { const { row, col } = this.parseSquareToBoard(coordinate); return this.chessboard[row][col]; } setSquare(coordinate, value) { const { row, col } = this.parseSquareToBoard(coordinate); this.chessboard[row][col] = value; } printBoard() { // 使用setSquare完成赋值 this.setSquare('a1', "R "); this.chessboard.forEach(row => { row.forEach(piece => process.stdout.write(piece ? piece : "X ")); console.log(); }); } }
使用时,读取元素用this.getSquare('a1'),赋值用this.setSquare('a1', "R "),逻辑清晰不易出错。
方案2:返回带get/set的代理对象(单方法关联读写)
若希望通过同一个方法关联读写操作,可让square返回包含value属性的对象,利用getter/setter间接修改数组元素:
class Chessboard { constructor() { this.chessboard = Array.from({ length: 8 }, () => Array(8).fill(null)); } parseSquareToBoard(coordinate) { const colChar = coordinate[0]; const rowNum = coordinate[1]; return { col: colChar.charCodeAt(0) - 'a'.charCodeAt(0), row: 8 - parseInt(rowNum, 10) }; } square(coordinate) { const { row, col } = this.parseSquareToBoard(coordinate); const self = this; return { get value() { return self.chessboard[row][col]; }, set value(val) { self.chessboard[row][col] = val; } }; } printBoard() { // 通过.value属性完成赋值 this.square('a1').value = "R "; this.chessboard.forEach(row => { row.forEach(piece => process.stdout.write(piece ? piece : "X ")); console.log(); }); } }
这种方式下,读取元素用this.square('a1').value,赋值用this.square('a1').value = "R ",用单个方法封装了读写逻辑。
内容的提问来源于stack exchange,提问作者Almaur
相关产品推荐
相关产品推荐

