【问题标题】:Dynamically parsing JSON arrays in JavaScript在 JavaScript 中动态解析 JSON 数组
【发布时间】:2021-01-15 23:09:04
【问题描述】:

我正在尝试使用 discord.js (v12) 中的 JavaScript 解析本地存储在我的机器上的 JSON 文件。这个 JSON 有几个键和值:

{
    "name": "Robert",
    "rank": "Owner",
    
    "hobbies": [{
        "id": 1,
        "name": "gaming"
    }, {
        "id": 2,
        "name": "listening to music"
    }, {
        "id": 3,
        "name": "vibing"
    }, {
        "id": 4,
        "name": "driving down the highway"
    }],

    "roles": [{
        "id": 1,
        "name": "Founder"
    }, {
        "id": 2,
        "name": "Premium Member"
    }]
}

我想在 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(name)
var obj = JSON.parse(raw)
    
for (var item in obj) {

    if (obj[item] instanceof Object) {
        for (var i in obj.hobbies) {
            noted += `${obj.hobbies[i].name}, `
        }
    } else {
        noted += `${item}: ${obj[item]}\n`
        noted += `hobbies: `
    }
}

message.channel.send(noted)

变量name是代码顶部的const name = require("./names.json");

此代码适用于 namerankhobbies

roles 如果我希望它可见,必须在 for 循环中手动检查它。我的目标是自动检测任何要添加的新键并将其添加到 noted 变量中。

我已经看到使用map() 完成了类似的操作,但我尝试过但没有得到任何好的结果。这也是相当草率的代码,但我对保持它的清洁不感兴趣。

【问题讨论】:

    标签: javascript arrays json parsing nested


    【解决方案1】:

    你可以用mapjoin做这样的事情:

    const obj = {"name":"Robert","rank":"Owner","hobbies":[{"id":1,"name":"gaming"},{"id":2,"name":"listening to music"},{"id":3,"name":"vibing"},{"id":4,"name":"driving down the highway"}],"roles":[{"id":1,"name":"Founder"},{"id":2,"name":"Premium Member"}]};
    
    const noted = Object.entries(obj)
                        .map(([key, val]) =>
                          `${key}: ${
                            val instanceof Array ? val.map(x => x.name).join(', ') : val
                           }`)
                        .join('\n');
    
    console.log(noted);

    【讨论】:

      【解决方案2】:

      这是使用object-scan 的迭代解决方案。

      我觉得它更容易阅读,但最重要的是它非常灵活地决定你要遍历哪些键。

      // const objectScan = require('object-scan');
      
      const myData = { name: 'Robert', rank: 'Owner', hobbies: [{ id: 1, name: 'gaming' }, { id: 2, name: 'listening to music' }, { id: 3, name: 'vibing' }, { id: 4, name: 'driving down the highway' }], roles: [{ id: 1, name: 'Founder' }, { id: 2, name: 'Premium Member' }] };
      
      const convert = (data) => {
        const r = objectScan(['*', '*[*].name'], {
          reverse: false,
          filterFn: ({ isLeaf, context, key, value }) => {
            if (isLeaf) {
              if (!(key[0] in context)) {
                context[key[0]] = value;
              } else {
                context[key[0]] += `, ${value}`;
              }
            }
          }
        })(data, {});
        return Object.entries(r).map(([k, v]) => `${k}: ${v}`).join('\n');
      };
      
      console.log(convert(myData));
      /* =>
      name: Robert
      rank: Owner
      hobbies: gaming, listening to music, vibing, driving down the highway
      roles: Founder, Premium Member
       */
      .as-console-wrapper {max-height: 100% !important; top: 0}
      <script src="https://bundle.run/object-scan@13.8.0"></script>

      免责声明:我是object-scan的作者

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-23
        • 2018-12-28
        • 1970-01-01
        • 2011-01-30
        • 2012-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多