Javascript 筛选出递归目录路径

Javascript 筛选出递归目录路径,javascript,node.js,filesystems,Javascript,Node.js,Filesystems,给定一个文件数组,如何筛选出其他路径的子路径 例如: var pathList = [ "/foo/bar/fooBar", "/foo/bar", "/foo" ]; 调用函数parentpath(pathList)应该返回一个包含一个元素“/foo”的数组,因为“/foo/bar”和“/foo/bar/fooBar”都是“/foo”的子元素 编辑1: 函数parentpath(pathList)应该返回每个路径,这些路径要么是唯一的,要么是一个或多个路径的父路径 更

给定一个文件数组,如何筛选出其他路径的子路径

例如:

var pathList = [
    "/foo/bar/fooBar",
    "/foo/bar",
    "/foo"
];
调用函数
parentpath(pathList)
应该返回一个包含一个元素
“/foo”
的数组,因为
“/foo/bar”
“/foo/bar/fooBar”
都是
“/foo”
的子元素

编辑1: 函数
parentpath(pathList)
应该返回每个路径,这些路径要么是唯一的,要么是一个或多个路径的父路径

更准确的例子是:

var pathList = [
    "/foo/bar/foobar/foobar/foobar",
    "/foo/bar/foobar/foobar",
    "/foo/bar/foobar",
    "/foo/bar2"
];

其中,
parentpath(pathList)
将返回
[“/foo/bar/foobar”,“/foo/bar2”]

您可以按长度升序对数组排序,并检查字符串是否与存储的字符串匹配

如果不匹配,则将其添加到结果集中

var pathList=[“/foo/bar/fooBar”、“/foo/bar”、“/foo”、“/bb”、“/bb/a”],
结果=路径列表
.sort((a,b)=>a.length-b.length)
.减少((r,s)=>{
如果(!r.some(t=>s.startsWith(t)))r.push(s);
返回r;
}, []);
控制台日志(结果)

.as控制台包装{max height:100%!important;top:0;}
像这样的东西怎么样

function getParentPaths(pathList) {
  const splitPaths = pathList.map(path => {
    return path.split("/")[1];
  });

  const parentPaths = splitPaths.filter((item, index) => {
    return splitPaths.indexOf(item) === index;
  });

  console.log(parentPaths);
}
这里有一个方法

function filterOutNestedPaths(pathList) {
   var result = [];
   pathList.sort().forEach(x => {
      if(!result.some(s => x.startsWith(s))) result.push(x);
   })
   return result;
}
[编辑]

如果您要在许多地方调用此方法,只需将此函数添加到Array prototype中,并像调用内置方法一样调用它

您可以让它返回一个新数组

    Array.prototype.returnFilterNestedPaths = function getParentPaths() {
      var result = [];
        pathList.sort().forEach(x => {
            if(!result.some(s => x.startsWith(s))) result.push(x);
        })
      return result;
    }
或者修改原始数组本身

   Array.prototype.modifyFilterNestedPaths = function getParentPaths() {
      var result = [];
        pathList.sort().forEach(x => {
            if(!result.some(s => x.startsWith(s))) result.push(x);
        })
      this.splice(0, this.length, ...result);
    }
用法:

var pathList = ["/foo/bar/fooBar","/foo/bar","/foo","/foo1/bar1","/foo1",   "/foo1/bar2","/foo1/bar2/foo1bar2"];

var filteredlist = pathList.returnFilterNestedPaths() // this returns a new array which you need to catch.
pathList.modifyFilterNestedPaths()  // this modifies the original list itself.

如果数组中的最小路径的阶数大于1,则解决方案将不起作用。请参阅我的编辑以获得更好的解释。已更新解决方案。谢谢你在里面报道这个问题。