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

按指定子串出现位置排序JavaScript数组的技术需求

自定义排序:基于子串出现位置的排序方案

嘿,我来帮你搞定这个排序需求!核心思路就是利用Array.sort()的自定义比较函数,根据子串"da"在每个字符串中的首次出现位置来排序,完全不用传统的升/降序逻辑。

直接上可运行的代码:

var countries = ["Algeria", "Canada", "Danmark", "Estonia"];
var search = "da";
const lowerSearch = search.toLowerCase();

// 注意:如果不想修改原数组,先用扩展运算符或slice复制一份
const sortedCountries = [...countries].sort((a, b) => {
  // 统一转小写,避免大小写匹配问题
  const lowerA = a.toLowerCase();
  const lowerB = b.toLowerCase();
  
  // 获取子串在两个字符串中的首次出现位置
  const posA = lowerA.indexOf(lowerSearch);
  const posB = lowerB.indexOf(lowerSearch);
  
  // 排序规则:
  // 1. 两个都包含子串:出现位置更早的排前面
  if (posA !== -1 && posB !== -1) {
    return posA - posB;
  }
  // 2. 只有一个包含子串:包含的排在前面
  if (posA !== -1) return -1;
  if (posB !== -1) return 1;
  // 3. 都不包含:保留原数组的相对顺序
  return 0;
});

console.log(sortedCountries); // 输出: ["Danmark", "Canada", "Algeria", "Estonia"]

逻辑拆解:

  1. 大小写兼容:把搜索串和目标字符串都转成小写,这样"Da"和"da"能被正确匹配,不会因为大小写差异导致找不到子串。
  2. 位置比较:
    • Danmark转小写后是danmark,"da"出现在索引0;Canada转小写是canada,"da"出现在索引4。0比4小,所以Danmark会排在Canada前面。
    • 对于不包含"da"的Algeria和Estonia,我们返回0让它们保持原数组的相对顺序(ES2019及之后的JS引擎中,sort是稳定排序,所以原顺序会被保留)。
  3. 不修改原数组:用[...countries]复制原数组后再排序,避免破坏原始数据。

这样就完全符合你的需求啦!

内容的提问来源于stack exchange,提问作者Simon Sondrup Kristensen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:11:18