如何以编程方式检测 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个回答
1
投票

正如您所发现的,

minimatch
不是这项任务的良好匹配。相反,我们必须自己创建算法(这可以在运行代码时提高时间效率)。首先,我们必须将 glob 分为主路径和带星号的部分。我们将它们分别称为 pathjuice

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 };
}

现在,我们必须输入我们的全局对象并使用

splitGlobs()
:

将它们分开
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.