我该如何循环遍历一个数组?

3
我在遍历一个数组时遇到了问题。我正在为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]}`);
       }
};

我是一名初学者,因此请您比平时更详细地解释。
3个回答

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

我们可以得到一个数组,其中每个内部数组都是键值对的另一个数组。 现在,我们可以使用数组解构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"

您现在可以看到,它正确地返回了所有的键和值。我们只需稍微修改一下以满足您的要求,并发送所需的消息即可。

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字符串
//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]));


0
你使用了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}`)
})


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接