如何用变量在JSON文件中查找对象?Node.js/JavaScript技术疑问
解决方法:调整JSON结构+使用方括号访问动态键
首先,你的JSON结构可以优化得更实用——当前table是一个数组,里面嵌套着以用户ID为键的对象,这种结构会让查找用户时区变得繁琐。更合理的做法是把table改成对象,直接用用户ID作为键,对应的值是包含时区的对象,这样可以直接通过ID快速定位,不用遍历数组。
第一步:修正JSON结构
把你的timezones.json改成这样(补全未闭合的括号,调整结构):
{ "table": { "221757857836564485": { "timezone": "timezone1" }, "12345": { "timezone": "Asia/Shanghai" } } }
第二步:调整Node.js代码
你的原代码有几个小问题:
- 缺少
fs模块的引入 user变量的定义逻辑有问题(不能用未定义的user.whatever.id)- 访问动态键时不能用点语法(点语法适用于固定键名,变量作为键名要用方括号)
修改后的代码如下:
// 先引入fs模块 const fs = require('fs'); // 读取并解析JSON文件 const content = fs.readFileSync("timezones.json"); const body = JSON.parse(content); // 假设这里是你获取到的用户ID(替换成实际的获取逻辑,比如从请求参数、数据库等) const user = "12345"; // 用方括号语法访问动态键,同时增加容错判断 if (body.table[user]) { console.log(`${user}'s timezone: ${body.table[user].timezone}`); } else { console.log(`No timezone data found for user ID: ${user}`); }
为什么这样可行?
当user是一个存储用户ID的变量时,body.table[user]会自动把变量的值作为键去查找对象中的对应属性,这是JavaScript中访问对象动态键的标准方式。而调整后的JSON结构让这种查找直接高效,不需要遍历数组。
如果暂时不想修改JSON结构(不推荐)
如果因为某些原因不能改JSON,你需要遍历table数组找到包含目标用户ID的对象,代码会繁琐一些:
const fs = require('fs'); const content = fs.readFileSync("timezones.json"); const body = JSON.parse(content); const user = "221757857836564485"; // 遍历数组查找用户 const userEntry = body.table.find(item => item[user]); if (userEntry) { console.log(`${user}'s timezone: ${userEntry[user][0].timezone}`); } else { console.log(`User not found`); }
这种方式效率更低,尤其是当用户数量多的时候,所以还是优先推荐调整JSON结构。
内容的提问来源于stack exchange,提问作者spikegd
相关产品推荐
相关产品推荐

