Javascript 如何获取JS对象中特定嵌套属性的所有值

Javascript 如何获取JS对象中特定嵌套属性的所有值,javascript,object,Javascript,Object,我似乎找不到一个满意的答案,所以很抱歉,如果这个问题是一个重复的问题,也许我甚至不知道如何表达我想要实现的目标 这是一个示例代码: var characters = { hero: { name: 'player', hp: 100, moves: { attack1: { damage: 10 }, attack2: { damage: 20 }, attack3: {

我似乎找不到一个满意的答案,所以很抱歉,如果这个问题是一个重复的问题,也许我甚至不知道如何表达我想要实现的目标

这是一个示例代码:

var characters = {
  hero: {
    name: 'player',
    hp: 100,
    moves: {
      attack1: {
        damage: 10
      },
      attack2: {
        damage: 20
      },
      attack3: {
        damage: 30
      }
    }
  }
}
我想做的是为损伤值编写一个选择器,将它们一分为二,或者一次对所有损伤值进行任何其他计算。现在我一直在用控制台日志检查不同的语法

console.log(characters.hero.moves[what here?].damage);
但我不知道下一步该怎么做,只获取整数,然后编辑它们。 我已经知道*不能在这里全选。这是我第一次使用对象。例如,是否需要编写for函数? 我不希望它变成数组或其他任何东西,因为我看到了一些使用它们的答案。我只想得到这些值,然后一次将它们全部更改为乘、除、加或减。

好吧,你有一个对象(
移动
),它有其他对象。您可以
对象的每个值映射到某个嵌套值

您可以使用(返回一个包含给定对象所有值的数组),然后执行映射

比如:

const字符={
英雄:{
姓名:'玩家',
惠普:100,
移动:{
附件1:{
损失:10
},
附件2:{
损失:20
},
附件3:{
损坏:30
}
}
}
};
const movesDamage=Object.values(characters.hero.moves)
.map((移动)=>移动伤害);

console.log(movesDamage);//=>[10,20,30]
理想情况下,移动属性应该是一个数组,但是,考虑到您拥有的数据(并假设每个“攻击”属性都是一个具有一个称为损坏的属性的对象),那么:

var movesKeys = Object.keys(characters.hero.moves);

for (var key in movesKeys)
{
    var attackObject = characters.hero.moves[key];
    attackObject.damage = attackObject.damage * 2; // double the damage
}

要将所有损坏值相加:

characters.hero.moves.attack1.damage + characters.hero.moves.attack2.damage + characters.hero.moves.attack3.damage
如果你不知道英雄有多少武装分子使用这个:

var total_damage = 0;
Object.keys(characters.hero.moves).forEach(function(key) {
  total_damage += characters.hero.moves[key].damage;
});
console.log(total_damage);
//修复了错误:D
变量字符={
英雄:{
姓名:'玩家',
惠普:100,
移动:{
附件1:{
损失:10
},
附件2:{
损失:20
},
附件3:{
损坏:30
}
}
}
}
//以下函数接受一个函数作为其参数
//此参数函数给定一个数字(损坏数)
//参数函数返回的数字将成为新的损坏数字
功能编辑DMG(fn){
var moves=characters.hero.moves
对象。关键点(移动)
.forEach(a=>移动[a]。伤害=fn(移动[a]。伤害))
}
//示例用法
editDmg(
n=>n*2//将所有dmg值乘以2(您可以在此处使用任意数学方程,如n=>n基于方程的方程)
)
console.log(字符)
//第二次使用来证明我已经修复了它
editDmg(n=>n/2)

console.log(“第二次”,字符)
这一个似乎不起作用。movesKeys在签入控制台后只显示名称“attack1”等,所以我想这就是为什么我会受到“未定义的伤害”-它不再是一个对象,而是一个正确的名称。如果key=
attack1
,那么下一行
var attackObject=characters.hero.moves[key]
将返回attack1对象,您可以从中访问
attackObject.damage