在JavaScript中动态解析JSON数组
我正试图在discord.js(v12)中用JavaScript解析本地存储在我机器上的JSON文件。此JSON有几个键和值:在JavaScript中动态解析JSON数组,javascript,arrays,json,parsing,nested,Javascript,Arrays,Json,Parsing,Nested,我正试图在discord.js(v12)中用JavaScript解析本地存储在我机器上的JSON文件。此JSON有几个键和值: { “姓名”:“罗伯特”, “等级”:“所有者”, “爱好”:[{ “id”:1, “名称”:“游戏” }, { “id”:2, “姓名”:“听音乐” }, { “id”:3, “名称”:“振动” }, { “id”:4, “名称”:“沿公路行驶” }], “角色”:[{ “id”:1, “姓名”:“创始人” }, { “id”:2, “名称”:“高级会员” }] }
{
“姓名”:“罗伯特”,
“等级”:“所有者”,
“爱好”:[{
“id”:1,
“名称”:“游戏”
}, {
“id”:2,
“姓名”:“听音乐”
}, {
“id”:3,
“名称”:“振动”
}, {
“id”:4,
“名称”:“沿公路行驶”
}],
“角色”:[{
“id”:1,
“姓名”:“创始人”
}, {
“id”:2,
“名称”:“高级会员”
}]
}
我想在Discord上发送上述信息,如下所示:
name: Robert
rank: Owner
hobbies: gaming, listening to music, vibing, driving down the highway
roles: Founder, Premium Member
我也希望这是动态的。这意味着,如果在当前集合中添加了新的键和值,则我的代码应该进行调整
使用当前代码,这是我的结果:
name: Robert
rank: Owner
hobbies: gaming, listening to music, vibing, driving down the highway
这是我当前的代码:
let noted=``
var raw=fs.readFileSync(名称)
var obj=JSON.parse(原始)
用于(obj中的var项目){
if(对象的obj[项目]实例){
用于(对象爱好中的变量i){
注意+=`${obj.cabiods[i].name}`
}
}否则{
注意到+=`${item}:${obj[item]}\n`
注意+=`爱好:`
}
}
message.channel.send(注意)
变量name
是const name=require(“./names.json”)代码>位于代码顶部
此代码适用于名称
、等级
和爱好
角色
必须在for循环中手动检查,才能使其可见。我的目标是自动检测添加的任何新密钥,并将其添加到noted
变量中
我曾经看到过使用map()
做过类似的事情,但我尝试过,没有取得任何效果。这也是一个相当草率的代码,但我对保持代码整洁不感兴趣。您可以使用和执行以下操作:
const obj={“name”:“Robert”,“rank”:“Owner”,“业余爱好”:[{“id”:1,“name”:“gaming”},{“id”:2,“name”:“listing music”},{“id”:3,“name”:“vibing”},{“id”:4,“name”:“driving down the highway”}],“roles”:[{“id”:1,“name”:“Founder”},{“id”:2,“name”:“Premium Member”};
注释常量=对象条目(obj)
.map([key,val])=>
`${key}:${
数组的val实例?val.map(x=>x.name).join(','):val
}`)
.join('\n');
控制台日志(注)代码>这里是一个使用的迭代解决方案
我发现它更容易阅读,但最重要的是,它非常灵活,可以让您遍历哪些关键点
//const objectScan=require('object-scan');
const myData={name:'Robert',rank:'Owner',嗜好:[{id:1,name:'gaming'},{id:2,name:'Listing music'},{id:3,name:'vibing'},{id:4,name:'driving down the highway'}],角色:[{id:1,name:'Founder'},{id:2,name:'Premium Member'};
const convert=(数据)=>{
常量r=objectScan(['*','*[*].name']{
反面:错,
filterFn:({isLeaf,context,key,value})=>{
如果(isLeaf){
如果(!(上下文中的[0]键)){
上下文[键[0]]=值;
}否则{
上下文[键[0]]+=`,${value}`;
}
}
}
})(数据,{});
返回Object.entries(r.map)([k,v])=>`${k}:${v}`)。join('\n');
};
console.log(convert(myData));
/* =>
姓名:罗伯特
职级:所有者
爱好:玩游戏,听音乐,振动,在高速公路上开车
角色:创始人、高级会员
*/
。作为控制台包装{最大高度:100%!重要;顶部:0}