Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript多维数组到单个对象_Javascript_Arrays_Object_Tree - Fatal编程技术网

Javascript多维数组到单个对象

Javascript多维数组到单个对象,javascript,arrays,object,tree,Javascript,Arrays,Object,Tree,我很难写出一个算法。上下文如下:我有一个路径数组,我想把它放在一个对象中,就像重建一个文件树一样 以下是一个简单的示例: var paths = [ '/var/log/log.txt', '/var/log/test.txt', '/home/toto/someFile.txt', '/wtf.txt' ]; 我希望这个路径数组是这样一个对象: var tree = { var: { log: ['log.txt', 'test.txt']

我很难写出一个算法。上下文如下:我有一个路径数组,我想把它放在一个对象中,就像重建一个文件树一样

以下是一个简单的示例:

var paths = [  
  '/var/log/log.txt',  
  '/var/log/test.txt',  
  '/home/toto/someFile.txt',
  '/wtf.txt'  
];
我希望这个路径数组是这样一个对象:

var tree = {  
  var: {
    log: ['log.txt', 'test.txt']
  },
  home: {
    toto: ['someFile.txt']
  },
  wtf.txt: null // I don't know how to handle this case
};
有没有关于如何做这样一件事的提示

实际上,我有类似的东西,但它最终只有一个深度级别,而不是在根级别处理文件:

function rebuildTree(paths, tree) {
  paths.forEach(function (path) {
      var splittedPath;
      if (path.indexOf("/") > -1) {
          splittedPath = path.split('/');
      } else {
          splittedPath = [path];
      }

      splittedPath.some(function(item, index) {
          if (!tree.hasOwnProperty(item) && index > 0) {
              tree[item] = {};
          }

          if ((parseInt(index) + 1) <= (splittedPath.length - 1)) {
              var nextIndex = parseInt(index + 1);
              var nextPath = splittedPath.splice(0, index);
              tree[item] = rebuildTree(nextPath, tree[item]);
          }
      });
  });
} 

我在下面写了一个小助手函数,它应该很容易实现,检查注释看看它是如何工作的,查看控制台的输出

函数树路径{ //这将储存我们的树 var-tree={}; //这将贯穿我们所有的道路 paths.forEachfunctionpath{ //这将删除初始斜杠 ifpath.indexOf'/'==0 path=path.substring1; //查找所有单个文件/文件夹 路径=路径。拆分“/”; //如果只有一个,我们将假定它是一个文件,并将您的'null'赋值` ifpath.length==1{ 树[路径[0]]=树[路径[0]]| |空; 回来 } //创建一个变量来存储我们所在的当前分支 var branch=tree[path[0]]=tree[path[0]]| |{}; //循环遍历其余的值,在执行时重新初始化分支。 forvar i=1;i];对于根文件,也许:[wtf.txt]会更好?@Barmar或类似于[file.wtf]的简单内容。不过,最后的数组是个坏主意,因为这意味着一旦你让它工作起来,你给它一个更长的路径,它很容易失败。哦,你说得对!之后我将更轻松地处理数据结构。非常感谢你的帮助。