JavaScript获取带数字后缀字符串数组的最新版本元素
解决数组提取同类字符串最新版本的方案
嘿,这个问题其实挺常见的,我来给你捋个实用的解决方案😉
核心思路
我们需要把数组里的字符串按**前缀(非数字部分)**分组,每组中保留末尾数字最大的那个字符串——毕竟数字越大代表“版本越新”。关键在于准确拆分前缀和数字,并且用数字而非字符串比较大小(避免出现'9' > '10'的错误)。
具体实现代码
这里用JavaScript来写,逻辑清晰且能适配多种情况:
let array = ['House1', 'House2', 'House3', 'Block1', 'Block2', 'BlockSpecial1']; // 1. 分组并记录每个前缀对应的最大数字字符串 const groupedData = array.reduce((accumulator, currentStr) => { // 用正则拆分前缀和末尾数字:匹配前面所有非数字(尽可能短)+ 末尾连续数字 const matchResult = currentStr.match(/^(.*?)(\d+)$/); // 处理特殊情况:如果字符串没有末尾数字,直接保留(可根据你的需求调整) if (!matchResult) { accumulator[currentStr] = currentStr; return accumulator; } const prefix = matchResult[1]; const number = parseInt(matchResult[2], 10); // 更新当前前缀的最大数字记录 if (!accumulator[prefix] || number > accumulator[prefix].maxNum) { accumulator[prefix] = { maxNum: number, fullString: currentStr }; } return accumulator; }, {}); // 2. 从分组结果中提取最终需要的字符串数组 const latestVersions = Object.values(groupedData).map(item => item.fullString || item); console.log(latestVersions); // 输出:['House3', 'Block2', 'BlockSpecial1']
方案优势
- 适配多位数字:不管数字是1位、2位还是3位,
parseInt都会把它转成数字类型比较,比如House10会正确被判定为比House9新。 - 动态适配数组变化:不管数组后续新增多少同类字符串,只要保持“前缀+数字”的格式,这个逻辑都能自动筛选出最新版本。
- 兼容特殊情况:如果数组里出现不带末尾数字的字符串,代码会直接保留它(你可以根据实际需求修改这部分逻辑)。
内容的提问来源于stack exchange,提问作者Sandworm
相关产品推荐
相关产品推荐

