2017-04-19 42 views
1

我有一個按名稱對列表進行排序的排序函數,但我希望每個以下劃線開頭的項目都分組在頂部。 當按降序排序(Z-A)時,我需要強調下劃線到頂部。所以使用正常的localeCompare將不會起作用,因爲它會在底部加上下劃線。 對於項目名稱以下劃線開始我推到頂部使用:當對一個對象數組進行排序時,是否可以使用sort()進一步將已推送到頂部的項進行分組?

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

這樣做的問題是,所有這些項目都是一起在頂部,但他們都堆砌在一起我需要的是對他們進一步按姓名排序,即按照下劃線後面的字母排序。

我也需要這樣做,純粹作爲一個單一的排序功能。

+0

只返回'-1'或'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);

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()); 
相關問題