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

JavaScript对象数组按属性值排序并按自定义条件调整优先级

调整排序规则:让带/S后缀的元素优先于同前缀无后缀元素

默认的字典序排序之所以会把P1排在P1/S2前面,是因为字符/的ASCII码比字母小,字典序判定P1 < P1/S2。要实现你想要的「同前缀下带/S后缀的元素排在不带的前面」,只需要修改比较函数的逻辑就行:

核心思路

  • 先提取每个value的前缀(比如P1、P2,即第一个/之前的部分);
  • 如果两个元素前缀不同,仍按原字典序排序;
  • 如果前缀相同:
    • 带后缀(包含/)的元素优先级更高,排在前面;
    • 不带后缀的排在后面;
  • 若两者都有后缀或都没有,则按原字典序继续排序。

修改后的比较函数

function compare(a, b) {
  // 提取前缀:分割第一个/之前的内容
  const prefixA = a.value.split('/')[0];
  const prefixB = b.value.split('/')[0];
  
  // 前缀不同时,按字典序排序
  if (prefixA !== prefixB) {
    return prefixA.localeCompare(prefixB);
  }
  
  // 判断是否带有后缀
  const hasSuffixA = a.value.includes('/');
  const hasSuffixB = b.value.includes('/');
  
  // 带后缀的优先排在前面
  if (hasSuffixA && !hasSuffixB) {
    return -1;
  }
  if (!hasSuffixA && hasSuffixB) {
    return 1;
  }
  
  // 前缀和后缀状态都相同,按原字典序排序
  return a.value.localeCompare(b.value);
}

测试代码

var newArray = [ {value : "P1"}, {value : "P2/S2"}, {value : "P2"}, {value : "P1"}, {value : "P1/S2"}, {value : "P1/S3"}, {value : "P2/S1"}, {value : "P1/S3"}, {value : "P2/S2"}, {value : "P1"}, {value : "P2"}, {value : "P3"} ];
newArray.sort(compare);
console.log(newArray);

输出结果

[{"value":"P1/S2"},{"value":"P1/S3"},{"value":"P1/S3"},{"value":"P1"},{"value":"P1"},{"value":"P1"},{"value":"P2/S1"},{"value":"P2/S2"},{"value":"P2/S2"},{"value":"P2"},{"value":"P2"},{"value":"P3"}]

这样就完全符合你期望的排序规则啦~

内容的提问来源于stack exchange,提问作者Shafi PS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:13:51