javascript - 通过 JavaScript 映射 Json 数据

标签 javascript arrays json loops stringify

我有一个 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);

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

最佳答案

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

关于javascript - 通过 JavaScript 映射 Json 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59421451/

相关文章:

javascript - 动态设置json选择器

javascript - 将值从 Servlet 传递到 jquery

arrays - 如何使用 make-array 或 coerce 将列表转换为具有相同输出的 Common Lisp 中的一维数组(向量)?

c - 将结构体指针添加到指针数组

使用数组进行 C 编程读写

json - Oracle PL/SQL 是否提供了 JSON 模式验证器?

添加 json 编码时 JavaScript 代码出现故障

javascript - 如何删除浏览器地址栏中的部分网址

javascript - ajax 重新加载 ul/li div 并保留事件监听器(insertAdjacentHTML 除外)

javascript - 如何在图像上滑动切换文本?