Javascript 如前所述,将具有文件路径的数组转换为对象

Javascript 如前所述,将具有文件路径的数组转换为对象,javascript,node.js,Javascript,Node.js,我需要一个javascript函数将具有文件路径字符串的数组转换为对象,如下所示: let files = [ "Folder/file.ext", "Folder/file2.ext", "Folder/file3.ext", "Folder/nestedfolder/file.ext", "Folder2/file1.ext", "Folder2/file2.ext", "file1.ext", "file2.ext", "file3.ext", ];

我需要一个javascript函数将具有文件路径字符串的数组转换为对象,如下所示:

  let files = [
  "Folder/file.ext",
  "Folder/file2.ext",
  "Folder/file3.ext",
  "Folder/nestedfolder/file.ext",
  "Folder2/file1.ext",
  "Folder2/file2.ext",
  "file1.ext",
  "file2.ext",
  "file3.ext",
];

listToTree(files);
它应该输出一个包含如下对象的数组:

[
  {
    text: "Folder",
    children: [
      {text: "file.ext"},
      {text: "file1.ext"},
      {text: "file2.ext"},
      {text: "nestedfolder", children: [{text: "file.ext"}]},
    ]
  },
  {
    text: "Folder2",
    children: [
      {text: "file1.ext"},
      {text: "file2.ext"},
    ]
  },
  {text: "file1.ext"},
  {text: "file2.ext"},
  {text: "file3.ext"}
];
这是我正在使用的当前函数。但它并不完全存在

function listToTree(files) {
  let filestmp = files.map(file => {
    if (typeof file === "string") return file;
    return file.path
  });
  let filesl = filestmp.map(fileee => fileToObject(fileee));

  return filesl;
}

function fileToObject(filee) {
  if (filee.includes("/")) {
    // this is a folder
    let count = filee.indexOf("/");
    return {text: filee.substring(0, count), children: [fileToObject(filee.substring(count + 1))]}
  } else {
    // this is a file
    return {text: filee}
  }
}

export default listToTree
它输出:

[ { text: 'Folder', children: [ { text: 'file.ext' } ] },
  { text: 'Folder', children: [ { text: 'file2.ext' } ] },
  { text: 'Folder', children: [ { text: 'file3.ext' } ] },
  { text: 'Folder',
    children:
     [ { text: 'nestedfolder', children: [ { text: 'file.ext' } ] } ] },
  { text: 'Folder2', children: [ { text: 'file1.ext' } ] },
  { text: 'Folder2', children: [ { text: 'file2.ext' } ] },
  { text: 'file1.ext' },
  { text: 'file2.ext' },
  { text: 'file3.ext' } ]

现在你可以看到。每个文件列表数组都有自己的对象。我需要合并位于同一文件夹位置的文件。

将树表示为数组有点不方便,因为每次都需要搜索数组以找到合适的节点,这对于大型数组来说效率很低。On选项是只在一次过程中构建一个树对象,然后进行第二次过程,只获取
对象的值。下面是一个例子:

let files=[“Folder/file.ext”、“Folder/file2.ext”、“Folder/file3.ext”、“Folder/nestedfolder/file.ext”、“Folder2/file1.ext”、“Folder2/file2.ext”、“file1.ext”、“file2.ext”、“file3.ext”、];
函数addPath(arr,obj={}){
let component=arr.shift()
让current=obj[component]| |(obj[component]={text:component})
if(阵列长度){
addPath(arr,current.children | |(current.children={}))
}
返回obj
}
函数makeArray(obj){
设arr=Object.values(obj)
arr.filter(item=>item.children).forEach(item=>{
item.children=makeArray(item.children)
})
返回arr
}
//造树
让treeObj=files.reduce((obj,path)=>addPath(path.split('/'),obj),{})
//转换为数组
设arr=makeArray(treeObj)

console.log(arr)
以下是我的想法,一个函数,无递归:

const listToTree=files=>
files.map(file=>file.split('/'))
.reduce((输出,路径)=>{
让顶部=向外;
while(path.length>0){
让node=path.shift();
if(top.findIndex(n=>n.text==node)==-1){
顶推({
文本:节点
});
}
如果(路径长度>0){
让index=top.findIndex(n=>n.text==node);
top[索引]=top[索引]|{};
top[index]。children=top[index]。children | |[];
top[index].children.push({
文本:路径[0]
});
top=top[索引]。子项;
}
}
返回;
}, []);
让文件=[
'文件夹/文件.ext',
'文件夹/file2.ext',
'文件夹/file3.ext',
'文件夹/nestedfolder/file.ext',
'Folder2/nestedfolder1/nestedfolder2/file1.ext',
'Folder2/file2.ext',
'file1.ext',
'file2.ext',
“file3.ext”
];

log(listToTree(files))
不赞成我们为您编写的问题,请查看javascript字符串的.split()方法,了解递归。如果你遇到麻烦,试一下并寻求帮助。这是我当前的代码。但它并不完全在那里,太好了。你能把你目前的解决方案放在问题中,描述一下什么不起作用吗?已经有了。检查。你的代码可以工作,但是。如果我再深入一层,它就开始不正常了。我不知道你的意思。它对我有用。将测试输入/输出添加到demonstrateyap,您的代码可以正常工作。即使我再深入一两层。我把它标为正确答案。非常感谢。