【问题标题】:Get only the Deepest paths from Array仅从 Array 中获取最深的路径
【发布时间】:2019-05-07 05:21:59
【问题描述】:

我需要 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"
]

【问题讨论】:

  • 你能在这篇文章中包含这些路径吗?
  • 能否请您用文本代码和图像提出问题。而不是只有图片谢谢
  • 来吧,瓦西姆。您已经在该网站上停留了足够长的时间并积累了足够多的代表,以知道您甚至没有尝试自己解决的问题在这里不会奏效。
  • 我不明白为什么只有这三个会返回。还有其他相同深度的文件
  • '好问题'有点推动它,因为 OP 没有准确解释应该使用什么标准,这将导致选择这三个特定目录。甚至无法准确推断。

标签: javascript jquery arrays path directory


【解决方案1】:

您可以将路径字符串转换为具有父项和子项的项:

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),
);

【讨论】:

  • 它有两个问题,它没有忽略最深层次的路径其他路径并且它没有返回最后最长的路径
  • 在您的图片中 need first ..need those 3 paths。这是相互矛盾的。要获得第一个最长的索引,只需获取最长索引的第一个索引,或者如您现在在评论 last longest path 中所述,然后获取最后一个索引。你是在挑衅还是有正当的问题?
  • 我正在尝试为 Atom 编辑器做一个项目经理,我添加了另一张图片来解释我的问题。我已经编写了一个代码,但是对于大型系统文件来说运行速度很慢。
  • @Wasima。更新了答案。重要的是,数组中的所有元素共享一个共同的祖先,并且这个祖先在数组中。
  • @Wasima。如果您仍想在嵌套节点中包含文件但只想获取最后一个目录后代,那么您可以在 getLastDescendants 函数中执行以下操作:node.children.length === 0 ? !node.path.endsWith('.js'):result.concat(node)?result : result.concat(node.children.map ...the rest of the code
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多