我有一个排序功能,可以按名称对列表进行排序,但我希望每个以下划线开头的项目都在顶部进行分组。 当按降序排序(Z-A)时,我需要强制下划线到顶部。所以使用普通的localeCompare不会起作用,因为它会将下划线放在底部。 对于以下划线开头的项目名称,我使用以下方法将其推到顶部:
if(item1.name().indexOf("_") == 0){
res = -1
}
if(item2.name().indexOf("_") == 0){
res = 1
}
这个问题是所有这些项目都在顶部,但它们都混乱了,我需要的是让它们按名称进一步排序,即按照它排序在下划线之后的字母。
我还需要将其完全作为单一排序函数来完成。
答案 0 :(得分:0)
您的代码没有考虑两个项目都可能以下划线开头的可能性。有四种可能性:
if both start with "_", return result of comparing with localeCompare
if item1 starts with "_", it's less than item2
if item2 starts with "_", it's greater than item1
otherwise, neither starts with "_", so compare them with localeCompare
或者,在代码中:
if (item1.name().indexOf("_") == 0 && item2.name().indexOf("_") == 0)
res = item1.name().localeCompare(item2.name());
else if (item1.name().indexOf("_") == 0
res = -1;
else if (item2.name().indexOf("_") == 0
res = 1;
else
res = item1.name().localeCompare(item2.name());
答案 1 :(得分:-1)
您可以检查第一个字符,然后将'_'
的字符移到顶部,然后按降序排序。
var array = ['_a', 'a', 'abc', '_d', 'ef'];
array.sort(function (a, b) {
return (b[0] === '_') - (a[0] === '_') || b.localeCompare(a);
});
console.log(array);