在下面的数组中,第一个 glob 是第二个 glob 的子集:
[
"HomePage/03-LocalDevelopmentBuild/public/**/*.@(js)",
"HomePage/03-LocalDevelopmentBuild/**/*.@(js)"
]
但是我们如何以编程方式检测它呢? AFAIK,“minimatch”仅将文件路径或目录路径与 glob 进行比较,而不是 2 个 glob。
正如您所发现的,
minimatch
不是这项任务的良好匹配。相反,我们必须自己创建算法(这可以在运行代码时提高时间效率)。首先,我们必须将 glob 分为主路径和带星号的部分。我们将它们分别称为 path 和 juice:
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).
正如预期的那样。现在您可以更改虚拟文本以获得真正的功能!
希望这有帮助!愿代码与您同在...