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

如何调用对象键返回方法而非字符串,解决动态技能扣血NaN问题

解决对象属性动态访问的两个问题

直接来拆解你的问题,一步步修正代码、解决问题:

问题1:调用对象的键返回对应值(而非字符串)

首先要明确:对象的键本身是字符串,但你要的是键对应的值(不管是数值还是方法)。比如你的skills对象里,'Tackle'是键,5是它关联的值。如果想获取值,不能直接取键名字符串,而是要通过键名去访问对象的属性。

举个例子,如果你想拿到skills里第一个技能的值:

// 先获取所有技能键名的数组
const skillNames = Object.keys(userBattlePokemon[0].skills);
// skillNames 结果是 ['Tackle', 'LeechSeed']

// 通过键名获取对应的值
const firstSkillValue = userBattlePokemon[0].skills[skillNames[0]];
// firstSkillValue 就是 5,如果是方法的话会返回函数本身

问题2:用变量skillName动态访问技能,修复NaN错误

你的代码出现NaN的核心问题有两个:

  1. userBattlePokemon[0].skills[0]是错误写法——skills是对象,不是数组,不能用索引[0]访问,这会得到undefined
  2. 后续的userBattlePokemon[0].skills[0].skillName错上加错,undefined上访问属性只会得到undefined,数值减undefined自然变成NaN

下面是正确的实现方式:

第一步:正确获取技能名称变量

如果你想动态获取第一个技能的名称:

let skillName = Object.keys(userBattlePokemon[0].skills)[0];
// 此时 skillName 是字符串 'Tackle'

如果已经明确要使用某个技能,直接赋值就行:

let skillName = 'Tackle';

第二步:用方括号语法动态访问技能值

JavaScript里,当你要用变量作为对象的键时,必须用方括号语法(不能用点语法),这样才能让变量解析成对应的键名:

// 正确计算敌人生命值
enemyBattlePokemon[0].health = enemyBattlePokemon[0].health - userBattlePokemon[0].skills[skillName];
// 或者用更简洁的 -= 写法:
// enemyBattlePokemon[0].health -= userBattlePokemon[0].skills[skillName];

完整修正后的代码

const userBattlePokemon = [{ skills: { Tackle: 5, LeechSeed: 10 } }];
const enemyBattlePokemon = [{ health: 100 }];

// 动态获取第一个技能名称
let skillName = Object.keys(userBattlePokemon[0].skills)[0];

// 正确计算敌人剩余生命值
enemyBattlePokemon[0].health -= userBattlePokemon[0].skills[skillName];

console.log(enemyBattlePokemon[0].health); // 输出 95,完美解决NaN问题

额外提示

  • 点语法(obj.key)只能用于固定的键名,比如userBattlePokemon[0].skills.Tackle;而方括号语法(obj[variable])支持动态变量作为键名,这正是你需要的动态适配场景。
  • 如果你的skills里存的是方法(比如技能函数),同样可以用这个方式调用:userBattlePokemon[0].skills[skillName]()就能执行对应的技能方法。

内容的提问来源于stack exchange,提问作者Wil Son

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:52:32