You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于正则匹配按指定顺序排序对象数组,忽略未匹配项

按指定顺序排序数组,未匹配项后置

你需要将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>');

代码说明

  1. 映射优化:把sort_based_on_this_order转为Map结构,将每个key对应的索引存储起来,把查找时间从O(n)降到O(1),大幅提升排序效率。
  2. key提取处理:封装extractKey函数统一处理文件名匹配逻辑,同时兼容匹配失败(返回null)的场景。
  3. 排序逻辑调整:
    • 匹配到有效key且存在于排序数组的元素,使用对应索引参与排序。
    • 未匹配到key或key不在排序数组的元素,索引设为排序数组的长度,确保这类元素全部排在匹配元素之后。
    • 通过idxA - idxB实现升序排序,严格遵循指定顺序。
  4. 保护原数组:用[...attachments]创建原数组副本再排序,避免破坏原数据结构。

效果验证

运行代码后,attachments数组会呈现如下排序结果:

  • 提取key匹配sort_based_on_this_order的元素,严格按照该数组的顺序排列。
  • 提取key不匹配的元素(如文件名包含1666433926644、1666434048280、1666432801510的项),全部排在结果末尾。

内容的提问来源于stack exchange,提问作者Code Guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:45:49