2016-11-26 78 views
1

说我有一个文件数组,这些文件已经从下面我的代码中的更大的文件数组中匹配。为简单起见,我会说文件阵列如下:根据可选RegEx匹配的数量过滤数组

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

假设你的文件的组有你提到的结构,要检索与顺序多份文件(第1部分有更多的优先级比第3部分),你可以做类似如下:

  1. 使用作为条件的部件数量来排序chosenFiles的数组。为了做到这一点,文件的名称转换为数字(数字对应于每个部分的每个数字的连接)。
  2. 将关系编号文件存储在字典中。
  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);

+0

谢谢您的回答,可惜我是不是跟我原来的问题不够清楚的文件部分不一定是连续的。它们的顺序/优先级在用于构建RegExp的数组中已经是正确的('parts'),所以希望您给我的帮助可以帮助我找到解决方案。 – Cordegen

+0

那么,我的整个想法就是这样,给你一个如何解决问题的想法。很难(有时不可能)给出准确的答案(大多数情况下,问题只是指出问题的一部分)。请考虑将我的答案标记为问题的答案,以便它能够引导您解决问题。谢谢 :) – acontell

相关问题