排序对象数组时,是否可以使用sort()进一步将已推到顶部的项目分组?

时间:2017-04-19 10:57:19

标签: javascript sorting

我有一个排序功能,可以按名称对列表进行排序,但我希望每个以下划线开头的项目都在顶部进行分组。 当按降序排序(Z-A)时,我需要强制下划线到顶部。所以使用普通的localeCompare不会起作用,因为它会将下划线放在底部。 对于以下划线开头的项目名称,我使用以下方法将其推到顶部:

if(item1.name().indexOf("_") == 0){
    res = -1
}
if(item2.name().indexOf("_") == 0){
    res = 1
}

这个问题是所有这些项目都在顶部,但它们都混乱了,我需要的是让它们按名称进一步排序,即按照它排序在下划线之后的字母。

我还需要将其完全作为单一排序函数来完成。

2 个答案:

答案 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);