首页 > 解决方案 > 如何遍历未确定的 JSON 密钥并用它发送消息?

问题描述

所以,我做了一个命令,记录你正在寻找闪亮的神奇宝贝,你有多少,你花了/正在用多少鸡蛋来获得闪亮的,它工作正常。我的问题是有些人忘记了他们在该存储中注册的神奇宝贝,因此我希望能够发送一条包含他们在存储中注册的所有神奇宝贝的消息,如下所示:

You have registered the following pokémon:  
(All the pokémon you registered)

但是,我不知道如何遍历用户 ID 内的键。这是我的 json 文件的外观:

{
    "User's ID": {
        "Pokémon": {
            "encounters": value,
            "shinies": value
        },
        "Pokémon": {
            "encounters": value,
            "shinies": value
        }
    }
}

我试过这样循环:

 const path = require('path');
 const fs = require('fs');

 const shiniesDataPath = path.resolve(__dirname, './Storage/shiniesData.json');

 function loadShiniesData() {
     return JSON.parse(fs.readFileSync(shiniesDataPath).toString());
 }

 const shiniesData = loadShiniesData();

 var trainer = shiniesData[message.author.id];

 if (args[0] === 'all') {
     for (var trainer in shiniesData) {
         message.channel.send([trainer])
     }
     return;
 }

但它只循环通过ID。

标签: javascriptnode.jsdiscord.js

解决方案


JSON 对象不应该有多个相同的键,而是您可以做的是将Pokémon键分配给array,如下所示:

{
    "User's ID": {
        "Pokémon": [
            {
                "encounters": value,
                "shinies": value
            },
            {
                "encounters": value,
                "shinies": value
            }
        ]
    }
}

为了访问密钥,假设上面的对象被分配给 variable obj。为了访问对象中的键,您可以执行

Object.keys(obj).forEach((key) => {
    // Do something
})

但是,如果您像我一样切换到数组,我想您会想做这样的事情:

obj['Pokémon'].forEach((item) => {
    // Do something
})

whereobj['Pokémon']返回映射到键“Pokémon”.foreach的数组,并遍历数组中的每个项目,您可以通过变量在匿名函数(由大括号括起来)中访问它item


推荐阅读