根据可选RegEx的数量过滤数组与优先级匹配

时间:2016-11-26 23:52:19

标签: javascript arrays regex sorting filtering

假设我有一个文件数组,这些文件已使用下面代码中的表达式从更大的文件数组中匹配。为简单起见,我会说文件数组如下:

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;
  }, []);
}

1 个答案:

答案 0 :(得分:0)

假设您的文件组具有您提到的结构,并且您希望按顺序检索包含更多部件的文件(第1部分的优先级高于第3部分),您可以执行以下操作:

  1. 使用作为条件的部件数量对selectedFiles的数组进行排序。为此,将文件名称转换为数字(数字对应于每个部分的每个数字的串联)。
  2. 将关系编号文件存储在字典中。
  3. 从字典中检索文件的名称,该键将是有序数组中的第一个元素。
  4. 
    
    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);