【问题标题】:how to get value if the object key is dynamic in typescript?如果对象键在打字稿中是动态的,如何获取值?
【发布时间】:2019-12-02 17:11:24
【问题描述】:

我有一个object.structure的数组就是这样。

animal = [{"cow":{"leg":4,"eye":2}},{"monkey":{"leg":2,"eye":2}}]

这里的第一个键是动态的,就像牛和猴子一样

所以我的问题是,如果第一把钥匙是动态的,我如何访问钥匙腿

【问题讨论】:

  • 你将如何确定你想要“牛”还是“猴子”或其他任何东西?
  • 使用Object.keys() 遍历键,并检查每个键的值是否包含leg。或者,如果它只是一个键,则无需循环;你可以做Object.keys(obj)[0] 来获得第一个密钥。或者,更好的是,如果您实际上不需要密钥名称而只想知道leg 是否存在,请使用Object.values(obj)[0].leg
  • 动态是什么意思。你需要遍历数组并使用object.keys函数来获取键名并使用它来获取数组内的值。如果你不确定这些(猴子,牛...)键

标签: javascript typescript object


【解决方案1】:

您可以使用新添加的Object.entries,这对imo最有意义。

因此,对于您拥有的数据:

const animal = ...
for (a of animal) {
    const [animalName, animalDesc] = Object.entries(a)[0]; // assumes there is only one
}

【讨论】:

    【解决方案2】:

    如果您确定数组中的每个对象仅作为 1 个属性(这将是动物的类型),您可以这样做。

    animals = [{"cow":{"leg":4,"eye":2}},{"monkey":{"leg":2,"eye":2}}];
        
    for (let animal of animals) {
      let propName = Object.keys(animal)[0];
      let result = animal[propName];
      console.log(result); // <- Do what you want with it
    }

    【讨论】:

    • @TylerRoper 谢谢,我按照您的建议将其作为内联 sn-p。此外,使用提供的数组它可以工作,但是我会尝试提出更好的解决方案。
    • @vivek_23 我没有用Object.keys() 遍历数组,我只是用它来获取每个动物的键。
    • @DavidFontes 啊!!忽略了这一点。
    【解决方案3】:

    您可以使用mapObject.keysmap 将返回一个新数组。 Object.keys 用于获取动物数组中每个对象内的所有键。然后这行elem[getKeys].leg 将检索腿键的值

    let animal = [{
      "cow": {
        "leg": 4,
        "eye": 2
      }
    }, {
      "monkey": {
        "leg": 2,
        "eye": 2
      }
    }];
    
    let legVal = animal.map((elem) => {
      let getKeys = Object.keys(elem)[0];
      return elem[getKeys].leg
    })
    
    console.log(legVal)

    【讨论】:

      【解决方案4】:

      也许将其转换为“非动态键”对象?

      const animal = [{"cow":{"leg":4,"eye":2}},{"monkey":{"leg":2,"eye":2}}]
      const newanimal = animal.map(obj => {
        const keys = Object.keys(obj)
        return keys.map(key => ({ key, value: obj[key] }))
      }).flat(Math.Infinity)
      
      console.log(newanimal)

      【讨论】:

      • @TylerRoper 感谢您的提示!或者我可以使用flat 展平数组
      • 您可以,尽管您使用的是额外的迭代 (map -> flat) 而不是单个 flatMap。不确定效率差异是多少,因此可能可以忽略不计。
      【解决方案5】:

      1) 用那个钥匙找到一只动物

      2) 用 [animal] 返回它

      3) 随心所欲地使用它 (.leg)

      const animals = [{ cow: { leg: 4, eye: 2 } }, { monkey: { leg: 2, eye: 2 } }];
      
      const animal = 'cow';
      const leg = animals.find(a => !!a[animal])[animal].leg;
      

      【讨论】:

        【解决方案6】:

        这将为您提供一个包含每种动物内容的对象数组。

        animals.map(animal => animal[Object.keys(animal)[0]]);
        

        【讨论】:

          猜你喜欢
          • 2020-11-12
          • 1970-01-01
          • 1970-01-01
          • 2022-01-12
          • 1970-01-01
          • 2019-08-23
          • 2020-07-26
          • 2020-07-15
          • 2022-01-25
          相关资源
          最近更新 更多