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
相关产品推荐
相关产品推荐

