繁体   English   中英

如何在 JS object 中获取特定嵌套属性的所有值

[英]How to get all values of specific nested property in JS object

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

所以无论如何这是示例代码:

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);

但我不知道下一步该做什么,只获取整数,然后编辑它们。 我已经知道 * 在这里对 select 不起作用。 这是我第一次使用对象。 例如,是否有必要为 function 写一个? 我不希望它变成数组或任何东西,因为我看到了一些使用它们的答案。 我只想获得这些值并一次更改它们以乘以,除以,增加或减少它们。

 //fixed error:D var characters = { hero: { name: 'player', hp: 100, moves: { attack1: { damage: 10 }, attack2: { damage: 20 }, attack3: { damage: 30 } } } } //the following function takes in ONE function as its argument //this argument function is given a number(a damage number) //the number the argument function returns become the new damage number function editDmg(fn){ var moves=characters.hero.moves Object.keys(moves).forEach(a=>moves[a].damage=fn(moves[a].damage)) } //example usage editDmg( n=>n*2 //multiplies all dmg values by 2(you can do any math equation like n=>n_based_equation_here) ) console.log(characters) //second use to prove i've fixed it editDmg(n=>n/2) console.log("for a second time",characters)

好吧,你有一个moves ( move ) 有其他对象。 您可以将 map的每个值moves object 到某个嵌套值。

您可以使用Object.values (它返回一个包含给定对象的所有值的数组),然后使用Array.prototype.map进行映射。

就像是:

 const characters = { hero: { name: 'player', hp: 100, moves: { attack1: { damage: 10 }, attack2: { damage: 20 }, attack3: { damage: 30 } } } }; const movesDamage = Object.values(characters.hero.moves).map((move) => move.damage); console.log(movesDamage); //=> [10, 20, 30]

理想情况下,您的 move 属性将是一个数组,但是,鉴于您拥有的数据(并假设每个“attackN”属性都是一个 object 具有一个称为损坏的单个属性,那么:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM