2016-11-26 83 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

相關問題