如何以编程方式检测 Node.js 中的 Glob 是否相交?

问题描述 投票:0回答:1

在下面的数组中,第一个 glob 是第二个 glob 的子集:

[
  "HomePage/03-LocalDevelopmentBuild/public/**/*.@(js)",
  "HomePage/03-LocalDevelopmentBuild/**/*.@(js)"
]

但是我们如何以编程方式检测它呢? AFAIK“minimatch”仅将文件路径或目录路径与 glob 进行比较,而不是 2 个 glob。

node.js glob minimatch
1个回答
0
投票

正如您所发现的,

minimatch
对于此任务来说不是一个好的选择。相反,我们必须自己创建算法。下面是一个可以实现这一目的的脚本:

function splitGlobs(glob) {
    let glob_arr = glob.split("*");
    let globPath = glob_arr[0];
    let globJuice = "";
    for (let i = 0; i < glob_arr.length; i++) {
        if (i != 0) {
            globJuice += "*" + glob_arr[i];
        }
    }
    return { path: globPath, juice: globJuice };
}

const globs = [
    "HomePage/03-LocalDevelopmentBuild/**/*.@(js)",
    "HomePage/03-LocalDevelopmentBuild/public/**/*.@(js)",
];

let glob0 = splitGlobs(globs[0]);
let glob1 = splitGlobs(globs[1]);

if (glob0.juice != glob1.juice) {
    console.log(
        `${globs[0]} and ${globs[1]} are not subsets -- they do not target the same file type.`,
    );
} else if (glob0.path.includes(glob1.path)) {
    console.log(`${globs[0]} is a subset of ${globs[1]}.`);
} else if (glob1.path.includes(glob0.path)) {
    console.log(`${globs[1]} is a subset of ${globs[0]}.`);
} else {
    console.log(
        `${globs[0]} and ${globs[1]} target the same file type, yet they are not subsets.`,
    );
}

执行此命令会产生

HomePage/03-LocalDevelopmentBuild/public/**/*.@(js) is a subset of HomePage/03-LocalDevelopmentBuild/**/*.@(js).

正如预期的那样。如果您不想输出一些文本,而是想添加某些功能,那完全取决于您!

希望这有帮助!愿代码与您同在...

© www.soinside.com 2019 - 2024. All rights reserved.