Chess.js中.moves({verbose:true})返回结构及JS/TS访问方法咨询
解决chess.js中
.moves({ verbose: true })的结构解析与棋步筛选提取问题 首先明确核心点:analysisBoard.moves({ verbose: true })返回的是包含详细棋步信息的对象数组,不是字符串数组。你之前直接用analysisBoard.moves[26]报错,是因为moves是方法而非属性,必须先调用方法拿到返回数组后再访问索引。
步骤1:获取完整的详细棋步数组
先调用方法并将结果存入变量,后续操作均基于该数组:
import { Chess } from "chess.js" const analysisBoard = new Chess("r1bq1rk1/ppppbppp/4p3/4P3/5Q2/2NB1NP1/PP1P3P/R1B1K2R w KQ - 1 11") // 调用方法获取详细棋步数组 const allVerboseMoves = analysisBoard.moves({ verbose: true }) // 现在可以通过索引访问指定棋步(注意JS数组索引从0开始,控制台显示的第26步对应数组索引25) console.log(allVerboseMoves[25]) // 对应你提到的Bxh7+那步
步骤2:筛选符合条件的棋步
我们需要筛选出将军或吃子的棋步,判断条件:
- 将军:
san字段包含"+" - 吃子:满足任一条件即可:
san字段包含"x"flags字段包含"c"(c代表吃子标记)captured字段存在且不为空
用数组的filter方法实现筛选:
const targetMoves = allVerboseMoves.filter(move => { // 判断是否将军 const isCheck = move.san.includes('+') // 判断是否吃子 const isCapture = move.san.includes('x') || move.flags.includes('c') || !!move.captured // 满足任一条件则保留该棋步 return isCheck || isCapture })
步骤3:提取需要的字段
用数组的map方法提取piece、from、san、after字段,转换成结构更简洁的新对象数组:
const extractedData = targetMoves.map(move => ({ piece: move.piece, from: move.from, san: move.san, after: move.after })) // 打印最终提取结果 console.log(extractedData)
完整TypeScript示例(带类型提示)
如果需要更清晰的类型约束,可以给棋步对象定义接口:
import { Chess } from "chess.js" // 定义verbose棋步的类型接口,匹配chess.js返回的结构 interface VerboseChessMove { color: 'w' | 'b' piece: 'p' | 'r' | 'n' | 'b' | 'q' | 'k' from: string to: string san: string flags: string lan: string before: string after: string captured?: string // 吃子场景下才存在,设为可选属性 } const analysisBoard = new Chess("r1bq1rk1/ppppbppp/4p3/4P3/5Q2/2NB1NP1/PP1P3P/R1B1K2R w KQ - 1 11") const allVerboseMoves: VerboseChessMove[] = analysisBoard.moves({ verbose: true }) as VerboseChessMove[] // 链式调用完成筛选与提取 const result = allVerboseMoves .filter(move => { const isCheck = move.san.includes('+') const isCapture = move.san.includes('x') || move.flags.includes('c') || !!move.captured return isCheck || isCapture }) .map(({ piece, from, san, after }) => ({ piece, from, san, after })) console.log(result)
关键知识点补充
- JS/TS中,方法必须加
()调用才能获取返回值,你之前的错误是把方法当成了数组属性 filter方法用于过滤数组元素,返回符合条件的新数组map方法用于转换数组元素,返回提取指定字段后的新数组!!move.captured是将captured字段转为布尔值,判断是否存在有效吃子(有吃子时该字段为被吃棋子类型,否则不存在)
内容的提问来源于stack exchange,提问作者vmishka
相关产品推荐
相关产品推荐

