过滤掉递归目录路径

Filtering out recursive directory paths

给定一个文件数组,如何过滤掉属于其他路径的子路径?

示例:

var pathList = [
    "/foo/bar/fooBar",
    "/foo/bar",
    "/foo"
];

调用函数 parentPaths(pathList) 应该 return 一个只有一个元素的数组 "/foo" 因为 "/foo/bar""/foo/bar/fooBar" 都是 [=13] 的子数组=].

编辑 1:

函数 parentPaths(pathList) 应该 return 每条路径要么是唯一的,要么是一个或多个路径的父路径。

一个更精确的例子是:

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

其中 parentPaths(pathList) 会 return ["/foo/bar/foobar", "/foo/bar2"].

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

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

var pathList = ["/foo/bar/fooBar", "/foo/bar", "/foo", "/bb", "/bb/a"],
    result = pathList
        .sort((a, b) => a.length - b.length)
        .reduce((r, s) => {
            if (!r.some(t => s.startsWith(t))) r.push(s);
            return r;
        }, []);

console.log(result);
.as-console-wrapper { 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;
}

[已编辑]

如果你要在很多地方调用这个方法,你可以简单地把这个函数添加到数组原型中,然后像调用内置方法一样调用它。

或者你可以把它return一个新数组

    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.