如何循环遍历数组
Posted
技术标签:
【中文标题】如何循环遍历数组【英文标题】: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]`);
;
我是一个初学者,所以请比你通常做的更详细地解释。
【问题讨论】:
【参考方案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(`$valuex $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`)
)
【讨论】:
以上是关于如何循环遍历数组的主要内容,如果未能解决你的问题,请参考以下文章