javascript - 仅从 Array 中获取最深的路径
问题描述
我需要 JavaScript 才能从数组中获取最深的路径。
输入是一个路径数组 预期输出:只有最深的路径
[
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\completion-provider.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\export",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\export\\global.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\export\\index.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\export\\local.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\index.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\babel.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\global.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\index.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\local.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\webpack.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\main.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\package-configs.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\filter-lookups-by-text.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\get-exports-from-prefix.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\get-module-from-prefix.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\internal-modules.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\lookup-alias.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\lookup-commonjs.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\path-helpers.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\regex-patterns.js"
]
这是另一个输入样本
[
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\completion-provider.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\export\\global.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\export\\index.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\export\\local.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\index.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\babel.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\global.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\index.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\local.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\webpack.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\main.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\package-configs.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\filter-lookups-by-text.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\get-exports-from-prefix.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\get-module-from-prefix.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\internal-modules.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\lookup-alias.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\lookup-commonjs.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\path-helpers.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\regex-patterns.js",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\package-lock.json",
"D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\package.json"
]
解决方案
您可以将路径字符串转换为具有父项和子项的项:
const createItem = (path, parent) => ({
children: [],
path,
parent,
});
然后对路径字符串进行排序,以便所有其他子项的根路径排在第一位:
const sortedPaths = paths.slice().sort();
然后将排序后的路径字符串减少为包含所有项目但子属性填充其实际子项目的 Map:
sortedPaths
.filter((path)=>!path.endsWith('.js'))//filter out js files
.map((path) => [path, parentPath(path)])
.slice(1) //remove first, it is root
.reduce((map, [path, parentPath]) => {
const parent = getParent(map, parentPath);
const item = createItem(path, parent);
parent.children.push(item);
return map.set(path, item);
}, new Map().set(sortedPaths[0], createItem(sortedPaths[0])))
不过,您只需要 rootNode,因此您可以.get(sortedPaths[0])
在该地图上执行操作。
如果您将根节点传递给调用的函数,getLastDescendents
则此函数可以递归检查子节点并仅添加没有子节点的项目。因为你有嵌套的项目,它会产生一个你需要展平的多维数组:
const flatten = (arr) =>
arr.reduce(
(result, item) =>
!Array.isArray(item)
? result.concat(item)
: result.concat(flatten(item)),
[],
);
const getLastDescendents = (rootNode) => {
const recur = (result, node) =>
node.children.length === 0
? result.concat(node)
: result.concat(
node.children.map((node) => recur(result, node)),
);
return flatten(recur([], rootNode));
};
总之,它看起来像这样:
const paths = [
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\completion-provider.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\export',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\export\\global.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\export\\index.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\export\\local.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\index.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\babel.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\global.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\index.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\local.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\lookups\\module\\webpack.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\main.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\package-configs.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\filter-lookups-by-text.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\get-exports-from-prefix.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\get-module-from-prefix.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\internal-modules.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\lookup-alias.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\lookup-commonjs.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\path-helpers.js',
'D:\\Program Files\\atom\\.atom\\packages\\autocomplete-modules\\lib\\utils\\regex-patterns.js',
];
const sortedPaths = paths.slice().sort();
const parentPath = (path) =>
path
.split('\\')
.slice(0, -1)
.join('\\');
const getParent = (map, path) =>
map.get(path) || getParent(map, parentPath(path));
const createItem = (path, parent) => ({
children: [],
path,
parent,
});
const rootNode = sortedPaths
.filter((path)=>!path.endsWith('.js'))//filter out js files
.map((path) => [path, parentPath(path)])
.slice(1) //remove first, it is root
.reduce((map, [path, parentPath]) => {
const parent = getParent(map, parentPath);
const item = createItem(path, parent);
parent.children.push(item);
return map.set(path, item);
}, new Map().set(sortedPaths[0], createItem(sortedPaths[0])))
.get(sortedPaths[0]);
const flatten = (arr) =>
arr.reduce(
(result, item) =>
!Array.isArray(item)
? result.concat(item)
: result.concat(flatten(item)),
[],
);
const getLastDescendents = (rootNode) => {
const recur = (result, node) =>
node.children.length === 0
? result.concat(node)
: result.concat(
node.children.map((node) => recur(result, node)),
);
return flatten(recur([], rootNode));
};
console.log(
getLastDescendents(rootNode).map((node) => node.path),
);
推荐阅读
- javascript - 将获取的数据作为道具(JSON)传递到状态以呈现数据
- java - Java 小程序运费计算器,如果低于 100 美元,不确定如何添加免费送货
- ios - Xcode 如何使用 TestFlight 从应用程序中符号化通过电子邮件发送的 .ips.beta 文件
- rest - REST Web 服务的 Bonjour 主机发现
- php - 我可以用函数结束 While 循环吗?
- python - 需要 Microsoft Visual C++ 14.0 - 错误 - pip install fbprophet
- python - 使用 pandas apply() 根据条件创建新列
- php - PHP - 字体回显问题
- php - Apache 和 IIS 之间的 PHP 脚本评估差异
- ubuntu - zfs ubuntu 18.04 上的 iozone 基准测试 - 错误:无法打开临时文件打开:无效参数