簡體   English   中英

JavaScript查找字符串的“最新”版本

[英]JavaScript find “newest” version of a string

這可能確實很容易,但是我在這里想不到任何好的解決方案:

我有一個字符串數組:

let array = ['House1', 'House2', 'House3', 'Block1', 'Block2', 'BlockSpecial1'];

隨着時間的推移,該數組會發生變化,但是在任何時候,我都希望能夠將該數組簡化為僅字符串的“最新”版本(根據結尾數字,它們在某些時候可能變為2位或3位數字),所以我最后想要的是:

['House3', 'Block2', 'BlockSpecial1']

數組簡化為一個對象,該對象的字符串為鍵,版本為值。 要獲取字符串和版本,可以使用String.match()數組解構 然后使用Object.entries()Array.map()將其組合回字符串:

 const array = ['House1', 'House2', 'House3', 'Block1', 'Block2', 'BlockSpecial1']; const result = Object.entries(array.reduce((r, s) => { const [, str, version] = s.match(/([A-Za-z]+)(\\d+)/); r[str] = (r[str] || 0) > version ? r[str] : version; // or r[str] = version if the versions are always in the right order return r; }, Object.create(null))) .map(([k, v]) => k + v); console.log(result); 

您實際上可以通過創建Map非常干凈地進行此操作。

 const array = ['House1', 'House2', 'House3', 'Block1', 'Block2', 'BlockSpecial1']; const re = /^([^]+?)(\\d+)$/; const result = [...new Map(array.map(s => re.exec(s).slice(1)))] .map(a => a.join("")); console.log(result); 

這是總結...

在原始數組上的.map() ,使用正則表達式將每個字符串在其文本和數字之間划分,然后返回僅包含捕獲部分的數組。

使.map()結果成為Map構造函數的參數。 這將創建一個映射,並將子數組的每個第一個成員作為每個鍵,將第二個作為值。

由於Map必須具有唯一的密鑰,因此您只會獲得為每個冗余密鑰生成的最后一個密鑰,該密鑰也將具有最大的數目。

然后將該映射轉換為其剩余的鍵/值條目,然后將它們重新連接為字符串。


這是上面相同的代碼,但將其分為幾部分,以便我們可以記錄每個步驟。

 const array = ['House1', 'House2', 'House3', 'Block1', 'Block2', 'BlockSpecial1']; const re = /^([^]+?)(\\d+)$/; const keysVals = array.map(s => re.exec(s).slice(1)); console.log("original split:", keysVals); const m = new Map(keysVals); const mapKeysVals = [...m]; console.log("mapped keys vals", mapKeysVals); const result = mapKeysVals.map(a => a.join("")); console.log("result", result); 

 let tmp, name; let array = ['House1', 'House2', 'House3', 'Block1', 'Block2', 'BlockSpecial1']; let newest = array.sort((a, b) => b.match(/\\d+$/)[0] - a.match(/\\d+$/)[0]).sort().reverse() .reduce((newArr, item) => (name = item.match(/.+[^\\d]+/)[0], name != tmp && (newArr.push(item), tmp = name), newArr), []); console.log(newest) //[ 'House3', 'BlockSpecial1', 'Block2' ] 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM