You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过自定义坐标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:11:32