【问题标题】:Creating a JSON tree with specific keys and values by array of strings通过字符串数组创建具有特定键和值的 JSON 树
【发布时间】:2021-07-11 11:13:30
【问题描述】:

我有一个字符串数组

["storage/", "storage/ui/", "storage/inventory/", "storage/model/", "storage/staticmos/", "storage/ui/server.js", "storage/ui/config.js", "storage/ui/elements/", "storage/ui/package.json", "storage/ui/model/", "storage/ui/gulpfile.js", "storage/ui/i18n/", "storage/ui/metadata/", "storage/ui/index.template.html"]

我的目的是创建一个 json 树,其中每个对象都将包含下一个属性:name(目录名/文件名)、type(文件或目录)、path(实际数组entry), id, children (仅当类型为目录时!如果目录中没有任何内容则为空数组)

所以返回的值应该是这样的:

[
            {
              id: 1,
              name: "Inventory",
              type: "directory",
              path: "../../elements/storage/Inventory",
              children: [
                {
                  id: 2,
                  name: "inventory.yaml",
                  type: "file",
                  path: "../../elements/storage/Inventory/inventory.yaml",
                },
              ],
            },
            {
              id: 3,
              name: "UI",
              type: "directory",
              path: "../../elements/storage/UI",
              children: [
                {
                  id: 4,
                  name: "Model",
                  type: "directory",
                  path: "../../elements/storage/UI/Model",
                  children: [
                    {
                      id: 5,
                      name: "viewmodel",
                      type: "directory",
                      path: "../../elements/storage/UI/Model/viewmodel",
                      children: [],
                    },
                  ],
                },
                {
                  id: 6,
                  name: "elements",
                  type: "directory",
                  path: "../../elements/storage/elements",
                  children: [],
                },
                {
                  id: 7,
                  name: "i18n",
                  type: "directory",
                  path: "../../elements/storage/i18n",
                  children: [],
                },
                {
                  id: 8,
                  name: "index.template.html",
                  type: "file",
                  path: "../../elements/storage/index.template.html",
                },
              ],
            },
            {
              id: 9,
              name: "DeviceConnector",
              type: "directory",
              path: "../../elements/storage/DeviceConnector",
              children: [],
            },
          ]

所以,我现在有两个大问题:

  1. reduce 操作对象后返回特定键
  2. 从目录中区分文件。

这是我现在得到的:

   createObject([...pathes]) {
    return pathes.reduce((obj, path) => {
      // eslint-disable-next-line no-return-assign
      path.split('/').reduce((obj, key) => {"id":'_' + Math.random().toString(36).substr(2, 9),"name":obj[key],"path":path} , obj);
      return obj;
    }, []);
  }

【问题讨论】:

    标签: javascript arrays json object reduce


    【解决方案1】:

    你可以利用最后一个斜线来改变类型。

    const
        data = ["storage/", "storage/ui/", "storage/inventory/", "storage/model/", "storage/staticmos/", "storage/ui/server.js", "storage/ui/config.js", "storage/ui/elements/", "storage/ui/package.json", "storage/ui/model/", "storage/ui/gulpfile.js", "storage/ui/i18n/", "storage/ui/metadata/", "storage/ui/index.template.html"],
        result = data.reduce((r, path) => {
            path.split('\/').reduce((level, name) => {
                if (name === '') {
                    level.type = 'directory';
                    return;
                }
                let directory = (level.children = level.children || []).find(q => q.name === name);
                if (!directory) level.children.push(directory = { id: '_' + Math.random().toString(36).substr(2, 9), name, type: 'file', path });
                return directory;
            }, r);
            return r;
        }, {}).children;
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 感谢妮娜的帮助!你能解释一下“??=”是什么意思吗?
    • 是否可以重构这个字符串: let directory = (level.children ??= []).find(q => q.name === name) 不知何故?我的编辑器无法编译它
    • 非常感谢!需要更多练习 - 可以推荐一些典型的任务让它练习更多吗?
    • 部分level.children = level.children || []分配level.children,如果这个值是truthy,像一个数组或(logical OR ||)数组识字。
    猜你喜欢
    • 2020-03-22
    • 2012-08-08
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多