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,则解决方案将不起作用。请参阅我的编辑以获得更好的解释。已更新解决方案。谢谢你在里面报道这个问题。