json 在Node.js中,我如何根据用户试图访问它来动态更改变量的名称?

wwtsj6pe  于 2023-08-08  发布在  Node.js
关注(0)|答案(2)|浏览(120)

我试图访问一个变量,其中USER_ID是动态的:

jsonParsed.users.[USER_ID].userID;

字符串
USER_ID将是一个基于discord用户ID的大数字。user.id与json文件中的id正确匹配。

function scrumJoin(user) {
  let USER_ID = user.id; //Example: user.id = 147477029364979999
  let content = fs.readFileSync('scrumUsers.json');
  let jsonParsed = JSON.parse(content);
  console.log('JSON parsed user ID: \n' + jsonParsed.users.[USER_ID].userID); //point of failure
}


JSON文件:

{
  "users": [
      {
          "1111111111111111": [{
              "userID": 1111111111111111,
              "phase": 1
          }]
      },
      {
          "147477029364979999": [{
              "userID": 147477029364979999,
              "phase": 1
          }]
      }
  ]
}


我希望USER_ID能够根据访问文件的用户动态更改。我知道这可能是一个非常简单的解决方案,但我正在努力弄清楚如何在谷歌中使用它,我很确定GPT是不正确的。
聊天GPT告诉我将其格式设置为:

jsonParsed.users[USER_ID].userID


但我很确定它指定了我试图访问的部分在数组中的位置,而不是部分本身的名称。

fdbelqdn

fdbelqdn1#

由于您的数据结构,您使它变得比必要的更复杂。但是,这里是如何做到这一点。
对于数据结构:

let jsonParsed = {
  "users": [
      {
          "1111111111111111": [{
              "userID": 1111111111111111,
              "phase": 1
          }]
      },
      {
          "147477029364979999": [{
              "userID": 147477029364979999,
              "phase": 1
          }]
      }
  ]
}

字符串
为了提取具有给定用户ID的用户,您必须执行以下操作:

let user;

// Loop through the users array:
for (let i=0; i<jsonParsed.users.length; i++) {
    let u = jsonParsed.users[i];

    // If the user object contains the USER_ID then
    // we've found the user:
    if (u[USER_ID] !== undefined) {
        user = u[USER_ID][0];
        break;
    }
}


我已经写了上面的清晰度。代码尽可能简单,以便尽可能容易理解。你可以用更现代的函数式风格来写:

let user = jsonParsed.users
               .find(u => u[USER_ID] !== undefined)[USER_ID][0];


这是更紧凑,但也有很多更多的打开。然而,它的意思与上面的代码完全相同,在数组中找到以USER_ID作为键的对象。

更好的数据结构。

更好的数据结构是简单地使用对象而不是数组:

let jsonParsed = {
  "users": {
      "1111111111111111": [{
          "userID": 1111111111111111,
          "phase": 1
      }],
      "147477029364979999": [{
          "userID": 147477029364979999,
          "phase": 1
      }]
  }
}


这样代码就变成了:

let user = jsonParsed.users[USER_ID][0];


就是这样,没有循环,没有过滤或查找。直接访问即可。
你甚至可以通过删除 Package 用户对象的数组来进一步改进它:

let jsonParsed = {
  "users": {
      "1111111111111111": {
          "userID": 1111111111111111,
          "phase": 1
      },
      "147477029364979999": {
          "userID": 147477029364979999,
          "phase": 1
      }
  }
}


有了这个数据结构,你的代码就简单了:

let user = jsonParsed.users[USER_ID];

t30tvxxf

t30tvxxf2#

更改了我的json文件的格式,不再包含不必要的数组:

{
  "users": {
     "147473029364979999": {
      "username": "username1",
      "userID": "147473029364979999",
      "phase": 1
    },
    "147473029364908888": {
      "username": "username2",
      "userID": "147473029364978888",
      "phase": 1
    }
  }
}

字符串
能够使用以下代码基于动态USER_ID检索正确的数据:

function scrumJoin(user) {
  let USER_ID = user.id;
  let content = fs.readFileSync('scrumUsers.json');
  console.log('JSON content: \n' + content);
  let jsonParsed = JSON.parse(content);
  console.log('JSON parsed: \n' + jsonParsed.users[USER_ID].phase);
}

相关问题