【问题标题】:How to convert an array of paths into JSON structure?如何将路径数组转换为 JSON 结构?
【发布时间】:2016-07-14 21:07:37
【问题描述】:

我找到了问题How to convert a file path into treeview?,但我不确定如何在 JavaScript 中得到想要的结果:

我正在尝试将路径数组转换为 JSON 树:

https://jsfiddle.net/tfkdagzv/16/

但是我的路径被覆盖了。

我正在尝试这样的事情:

[
    '/org/openbmc/path1', 
    '/org/openbmc/path2', 
    ...
]

...把它变成...

output = {
   org: {
     openbmc: {
       path1: {},
       path2: {}
     }
   }
}

我确信这很容易,但我错过了一些东西。

【问题讨论】:

  • 你能告诉我们你的尝试吗?

标签: javascript json javascript-objects


【解决方案1】:
const data = [
    "/org/openbmc/examples/path0/PythonObj",
    "/org/openbmc/UserManager/Group",
    "/org/openbmc/HostIpmi/1",
    "/org/openbmc/HostServices",
    "/org/openbmc/UserManager/Users",
    "/org/openbmc/records/events",
    "/org/openbmc/examples/path1/SDBusObj",
    "/org/openbmc/UserManager/User",
    "/org/openbmc/examples/path0/SDBusObj",
    "/org/openbmc/examples/path1/PythonObj",
    "/org/openbmc/UserManager/Groups",
    "/org/openbmc/NetworkManager/Interface"
];

const output = {};
let current;

for (const path of data) {
    current = output;

    for (const segment of path.split('/')) {
        if (segment !== '') {
            if (!(segment in current)) {
                current[segment] = {};
            }

            current = current[segment];
        }
    }
}

console.log(output);

您的解决方案很接近,只是您没有正确重置 current 变量。使用这个:

current = output;

而不是这个:

current = output[path[0]];

【讨论】:

    【解决方案2】:

    这个函数应该做的:

    var parsePathArray = function() {
        var parsed = {};
        for(var i = 0; i < paths.length; i++) {
            var position = parsed;
            var split = paths[i].split('/');
            for(var j = 0; j < split.length; j++) {
                if(split[j] !== "") {
                    if(typeof position[split[j]] === 'undefined')
                        position[split[j]] = {};
                    position = position[split[j]];
                }
            }
        }
        return parsed;
    }
    

    演示

    var paths = [
        "/org/openbmc/UserManager/Group",
        "/org/stackExchange/StackOverflow",
        "/org/stackExchange/StackOverflow/Meta",
        "/org/stackExchange/Programmers",
        "/org/stackExchange/Philosophy",
        "/org/stackExchange/Religion/Christianity",
        "/org/openbmc/records/events",
        "/org/stackExchange/Religion/Hinduism",
        "/org/openbmc/HostServices",
        "/org/openbmc/UserManager/Users",
        "/org/openbmc/records/transactions",
        "/org/stackExchange/Religion/Islam",
        "/org/openbmc/UserManager/Groups",
        "/org/openbmc/NetworkManager/Interface"
    ];
    
    var parsePathArray = function() {
        var parsed = {};
        for(var i = 0; i < paths.length; i++) {
            var position = parsed;
            var split = paths[i].split('/');
            for(var j = 0; j < split.length; j++) {
                if(split[j] !== "") {
                    if(typeof position[split[j]] === 'undefined')
                        position[split[j]] = {};
                    position = position[split[j]];
                }
            }
        }
        return parsed;
    }
    
    document.body.innerHTML = '<pre>' +
                              JSON.stringify(parsePathArray(), null, '\t')
                              '</pre>';

    (另见this Fiddle

    【讨论】:

      【解决方案3】:

      注意:结果数组需要合并

      此方法适用于文件和目录,并且仅使用数组作为数据格式。

      该结构基于作为文件夹的数组,第一个元素是文件夹名称,第二个元素是内容数组。

      文件只是数组中的常规字符串(但很容易成为包含属性的对象)

      转化 =>

      [
        '/home/',
        '/home/user/.bashrc',
        '/var/',
        '/var/test.conf',
        '/var/www/',
        '/var/www/index.html',
        '/var/www/index2.html'
      ]
      

      致 =>

      [
        ['home', [
          ['user', [
            '.bashrc'
          ]]
        ]],
        ['var', [
          'test.conf',
          ['www', [
            'index.html',
            'index2.html'
          ]]
        ]]
      ]
      

       

      脚本:

      var paths = [
        '/var/',
        '/var/test.conf',
        '/var/www/',
        '/var/www/index.html',
        '/var/www/index2.html'
      ]
      
      var parsed = []
      
      for (let path of paths) {
        let tree = path.split('/')
        let previous = parsed
      
        console.groupCollapsed(path)
        for (let item in tree) {
          const name = tree[item]
          const last = item == tree.length - 1
      
          if (name) {
            if (last) {
              console.log('File:', name)
              previous.push(name) - 1
            } else {
              console.log('Folder:', name)
              let i = previous.push([name, []]) - 1
              previous = previous[i][1]
            }  
          }
        }
        console.groupEnd(path)
      }
      
      console.warn(JSON.stringify(parsed))
      

      【讨论】:

        猜你喜欢
        • 2022-12-19
        • 1970-01-01
        • 2020-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-06
        • 1970-01-01
        相关资源
        最近更新 更多