假设我有一个文件数组,这些文件已使用下面代码中的表达式从更大的文件数组中匹配。为简单起见,我会说文件数组如下:
prefix_pt1_pt3_pt5_pt6
prefix_pt1_pt4_pt5_pt6
prefix_pt1_pt3_pt4_pt6
prefix_pt1_pt5_pt6
但文件名不一定是顺序的。
我想优先考虑每个捕获组。到目前为止我提出的代码只会优先处理文件,直到它与捕获组不匹配,因此从上面的文件中只选择第一个。我希望prefix_pt1_pt3_pt4_pt6
成为我职能的结果。
const parts = ['p1', 'p2', 'p3', 'p4', 'p5', 'p6'];
const existsRegex = new RegExp(
regexEscape(params.folder) +
regexEscape(prefix) +
parts.reduce((result, part) => result + `(_${regexEscape(part)})?`, '')
);
const validFiles = scanPath(existsRegex);
if (validFiles.length) {
const chosenFile = validFiles.reduce((file, currentFile) => {
const matches = currentFile.match(existsRegex);
const killFrom = matches.indexOf(undefined);
if (killFrom > 0) matches.length = killFrom;
if (matches.length > file.length) return matches;
return file;
}, []);
}
答案 0 :(得分:0)
假设您的文件组具有您提到的结构,并且您希望按顺序检索包含更多部件的文件(第1部分的优先级高于第3部分),您可以执行以下操作:
var chosenFiles = ['prefix_pt1_pt3_pt5_pt6',
'prefix_pt1_pt4_pt5_pt6',
'prefix_pt1_pt3_pt4_pt6',
'prefix_pt1_pt5_pt6'
],
dicc = {};
function getKey(arr) {
return arr.join('');
}
function addEntry(file, index) {
var numberArr = file.replace(/\D+/g, '-').split('-').splice(1).map(Number);
dicc[getKey(numberArr)] = file;
return numberArr;
}
function sortByFileNumber(a, b) {
var i = 0;
while (a[i] && b[i] && a[i] >= b[i++]) {}
return a === b ? 0 : a[i] ? -1 : 1;
}
function pickFirst(arr) {
return dicc[getKey(arr[0])];
}
var chosenFile = pickFirst(chosenFiles
.map(addEntry)
.sort(sortByFileNumber));
console.log(chosenFile);