按 JavaScript 映射 Json 数据

Map Json data by JavaScript

我有一个 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”])。群信息是新增的,依赖于parent-child信息。 1st parent 是第 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);

组信息生成不正确。我想弄清楚如何获取正确的组信息。如果您能帮我解决问题,我将不胜感激。

您可以使用 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);

我无法理解 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));