【问题标题】:Map Json data by JavaScript通过 JavaScript 映射 Json 数据
【发布时间】:2020-04-12 17:50:08
【问题描述】:

我有一个 Json 数据,想要以不同的格式保存。

我原来的json数据是:

{
  "info": {
    "file1": {
      "book1": {
        "lines": {
          "102:0": [
            "102:0"
          ],
          "105:4": [
            "106:4"
          ],
          "106:4": [
            "107:1",
            "108:1"
          ]
        }
      }
    }
  }
}

我想将其映射如下:

{
  "name": "main",
  "children": [
    {
      "name": "file1",
      "children": [
        {
          "name": "book1",
          "group": "1",
          "lines": [
            "102",
            "102"
          ],
          [
            "105",
            "106"
          ],
          [
            "106",
            "107",
            "108"
          ]
        }
      ],
      "group": 1,

    }
  ],
  "group": 0
}

但是书籍的数量和文件的数量会更多。在这行中,“”内的第一部分(在:之前)被采用(“106:4”变为“106”)。键中的数字排在第一位,然后值中的数字排在第一位,并列出一个列表([“106”、“107”、“108”])。组信息是新的,依赖于父子信息。第一个父母是第 0 组,依此类推。名字(“main”)也是用户定义的。

到目前为止,我尝试了以下代码:

function build(data) {
    return Object.entries(data).reduce((r, [key, value], idx) => {
      //const obj = {}
      const obj = {
        name: 'main',
        children: [],
        group: 0,
        lines: []
      }

      if (key !== 'reduced control flow') {
        obj.name = key;
        obj.children = build(value)
          if(!(key.includes(":")))
          obj.group = idx + 1;
      } else {
        if (!obj.lines) obj.lines = [];
        Object.entries(value).forEach(([k, v]) => {
          obj.lines.push([k, ...v].map(e => e.split(':').shift()))
        })
      }

      r.push(obj)
      return r;
    }, [])
  }

  const result = build(data);
  console.log(result);

组信息未正确生成。我试图弄清楚如何获得正确的组信息。如果您能帮我解决这个问题,我将不胜感激。

【问题讨论】:

  • 如何获得group 值?不应该是"name": "info" 而不是"name": "main"
  • 以其他条件为准,与“行”信息无关。这就是为什么我没有提到它。
  • 您的输出 json 无效。

标签: javascript arrays json loops stringify


【解决方案1】:

您可以使用reduce 方法并创建递归函数来构建嵌套结构。

const data = {"info":{"file1":{"book1":{"lines":{"102:0":["102:0"],"105:4":["106:4"],"106:4":["107:1","108:1"]}}}}}

function build(data) {
  return Object.entries(data).reduce((r, [key, value]) => {
    const obj = {}

    if (key !== 'lines') {
      obj.name = key;
      obj.children = build(value)
    } else {
      if (!obj.lines) obj.lines = [];
      Object.entries(value).forEach(([k, v]) => {
        obj.lines.push([k, ...v].map(e => e.split(':').shift()))
      })
    }

    r.push(obj)
    return r;
  }, [])
}

const result = build(data);
console.log(result);

【讨论】:

    【解决方案2】:

    我无法理解 group 属性背后的逻辑,因此您可能需要为此添加更多信息,但对于其余部分,您可以尝试这两个函数,将对象递归地转换为您想要获取的对象.

    var a = {"info":{"file1":{"book1":{"lines":{"102:0":["102:0"],"105:4":["106:4"],"106:4":["107:1","108:1"]}}}}};
    
    var transform = function (o) {
        return Object.keys(o)
                .map((k) => { 
                      return {"name": k, "children": (k === "lines" ? parseLines(o[k]) : transform(o[k])) } 
                  }
                )
    }
    
    var parseLines = function (lines) {
        return Object.keys(lines)
                .map(v => [v.split(':')[0], ...(lines[v].map(l => l.split(":")[0]))])
    }
    
    console.log(JSON.stringify(transform(a)[0], null, 2));

    【讨论】:

      猜你喜欢
      • 2018-09-28
      • 2022-12-14
      • 2023-03-18
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      相关资源
      最近更新 更多