按指定子串出现位置排序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"]
逻辑拆解:
- 大小写兼容:把搜索串和目标字符串都转成小写,这样
"Da"和"da"能被正确匹配,不会因为大小写差异导致找不到子串。 - 位置比较:
Danmark转小写后是danmark,"da"出现在索引0;Canada转小写是canada,"da"出现在索引4。0比4小,所以Danmark会排在Canada前面。- 对于不包含
"da"的Algeria和Estonia,我们返回0让它们保持原数组的相对顺序(ES2019及之后的JS引擎中,sort是稳定排序,所以原顺序会被保留)。
- 不修改原数组:用
[...countries]复制原数组后再排序,避免破坏原始数据。
这样就完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者Simon Sondrup Kristensen
相关产品推荐
相关产品推荐

