过滤掉递归目录路径
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.
给定一个文件数组,如何过滤掉属于其他路径的子路径?
示例:
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.