基于正则匹配按指定顺序排序对象数组,忽略未匹配项
按指定顺序排序数组,未匹配项后置
你需要将attachments数组按照sort_based_on_this_order的指定顺序排序:从每个元素的filename中提取末尾的13位数字,匹配的元素按指定顺序排列,未匹配的元素统一放在结果末尾。
问题分析
原代码的缺陷在于:当元素的提取key不在sort_based_on_this_order中时,indexOf返回-1,原逻辑会将这类元素排在匹配元素的前面,不符合需求;同时每次调用indexOf的查找性能较低,数组规模大时会拖慢排序速度。
修正后的实现
// 将排序数组转为映射,提升查找效率 const orderMap = new Map(); sort_based_on_this_order.forEach((key, index) => { orderMap.set(key, index); }); // 复制原数组再排序,避免修改原数据 const sortedAttachments = [...attachments].sort((a, b) => { // 提取文件名中的13位数字key,处理匹配失败的情况 const extractKey = (item) => { const matchResult = item.filename.match(/\b[0-9]{13}(?=\.[^.]+$)/); return matchResult ? matchResult[0] : null; }; const keyA = extractKey(a); const keyB = extractKey(b); // 确定排序索引:匹配项用对应顺序索引,未匹配项用排序数组长度(确保排在末尾) const idxA = orderMap.has(keyA) ? orderMap.get(keyA) : sort_based_on_this_order.length; const idxB = orderMap.has(keyB) ? orderMap.get(keyB) : sort_based_on_this_order.length; return idxA - idxB; }); document.write('<pre>' + JSON.stringify(sortedAttachments, null, 4) + '</pre>');
代码说明
- 映射优化:把
sort_based_on_this_order转为Map结构,将每个key对应的索引存储起来,把查找时间从O(n)降到O(1),大幅提升排序效率。 - key提取处理:封装
extractKey函数统一处理文件名匹配逻辑,同时兼容匹配失败(返回null)的场景。 - 排序逻辑调整:
- 匹配到有效key且存在于排序数组的元素,使用对应索引参与排序。
- 未匹配到key或key不在排序数组的元素,索引设为排序数组的长度,确保这类元素全部排在匹配元素之后。
- 通过
idxA - idxB实现升序排序,严格遵循指定顺序。
- 保护原数组:用
[...attachments]创建原数组副本再排序,避免破坏原数据结构。
效果验证
运行代码后,attachments数组会呈现如下排序结果:
- 提取key匹配
sort_based_on_this_order的元素,严格按照该数组的顺序排列。 - 提取key不匹配的元素(如文件名包含
1666433926644、1666434048280、1666432801510的项),全部排在结果末尾。
内容的提问来源于stack exchange,提问作者Code Guy
相关产品推荐
相关产品推荐

