【问题标题】:How can I loop through an array如何循环遍历数组
【发布时间】:2020-07-28 10:54:09
【问题描述】:

我在遍历数组时遇到问题。我正在为 Discord 制作一个 RPG 机器人,我需要在出现提示时显示玩家的 inventory。我尝试使用Object.values()、Object.map() 和Object.entries()。 items 的名称已经用 Object.keys(inventory) 解决了,但是 values 是问题所在。

var invItems = Object.keys(inventory);
var InvValues = Object.entries(inventory);
for (var i = 0; i <= invItems.length; i += 1) {
       if (invValues[i[1]] > 0) {
           message.channel.send(`${invValues[i[1]]}x ${invItems[i]}`);
       }
};

我是一个初学者,所以请比你通常做的更详细地解释。

【问题讨论】:

    标签: javascript object discord.js


    【解决方案1】:
    var invItems = Object.keys(inventory);
    var invValues = Object.entries(inventory); // fixed the capital i
    
    for (var i = 0; i <= invItems.length; i += 1) {
    
       if (invValues[i] > 0) {
           message.channel.send(`${invValues[i]}x ${invItems[i]}`);
       }
    };
    

    您没有使用i 作为索引,而是尝试像访问数组一样访问i[1]

    另外,在 Javascript 中,您还可以通过JSON.stringify 来查看对象结构。这会将您的inventory 打印到JSON String。

    //this may help you see what the inventory looks like
    for(let i = 0; i<inventory.length; i+=1)
    console.log(JSON.stringify(inventory[i]));
    
    

    【讨论】:

      【解决方案2】:

      您可以使用for...of 循环直接向message.channel 发送值,例如:

      for (let [key, value] of Object.entries(inventory)) {
        if (value > 0) {
          message.channel.send(`${value}x ${key}`);
        }
      }
      

      说明:

      Object.entries() 方法返回给定对象自己的可枚举字符串键属性 [key, value] 对的数组。所以,当我们像这样使用它时:

      const object1 = {
        a: 'somestring',
        b: 42
      };
      
      console.log(Object.entries(object1));

      你可以得到一个数组,里面的每个数组都是另一个键值对数组。现在,我们可以使用array destructuring 和for...of 循环来获取每个键和值:

      const object1 = {
        a: 'somestring',
        b: 42
      };
      
      for (let [key, value] of Object.entries(object1)) {
        console.log(`${key}: ${value}`);
      }
      
      // Returns:
      // "a: somestring"
      // "b: 42"

      您现在可以看到这会正确返回所有键和值。我们只需对其稍作修改以符合您的要求并将所需的消息发送回来。

      【讨论】:

        【解决方案3】:

        Object.entries 将提供一个键/值对数组数组,您在正确的轨道上。请注意这里:invValues[i[1]] 您正在尝试访问 i 的属性 1 可能是 undefined。如果您在此处使用forEach 进行迭代,实际上可以避免一些复杂性。

        const inventory = {
          itemA: 'description for A',
          itemB: 'description for B'
        }
        
        Object.entries(inventory).forEach(([key, value]) => {
          // replace with message.channel.send(...)
          console.log(`${key}: ${value}`)
        })

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-26
          • 2014-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-04
          相关资源
          最近更新 更多