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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 10:42:52