2016-07-29 73 views
-1

說我有一個隨機順序的所有26個字母的數組。我知道如何按字母順序使用Array.sort()函數進行排序。但是,如果我想要一個特定的字母表「M」作爲列表中的第一個,然後按字母順序排列其餘字母,我該如何排序。JavaScript數組按一定標準排序

目前我所做的是將數組中的「M」拼接起來,然後在排序後我將它移回列表中。這樣做還行嗎?還是有更清潔的方法來做到這一點?

例子:

未分類['b','c','d','m','a']

排序['m','a','b','c','d']

+1

添加未排序字符串和已排序字符串的示例。 –

+1

您目前的做法似乎比實際實現自己的排序算法更好。 – str

+0

剛剛添加@str所說的內容。 –

回答

2

正在做的這樣好,還是有一個更清潔的方式做到這一點?

這是好的,但如果你願意,你可以自定義排序:Array#sort接受,你可以用它來確定兩個條目應該以什麼順序的功能它一再呼籲通過sort在整理的過程。

看評論:

// Create the array 
 
var theArray = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""); 
 

 
// Sort it 
 
theArray.sort(function(left, right) { 
 
    // `left` and `right` are the two entries to compare. 
 
    // We return a negative number if `left` should come before `right`, 
 
    // 0 if they're equivalent for sorting purposes, or a positive number 
 
    // if `right` should come before `left`. 
 
    // So for M to be in front of all other letters, make sure you handle 
 
    // that in the return value: 
 
    if (left === "M") { 
 
     // Is the right also "M"? 
 
     if (right === "M") { 
 
      // Yes, equivalent for sorting 
 
      return 0; 
 
     } 
 
     // No, left should come first 
 
     return -1; 
 
    } 
 
    if (right === "M") { 
 
     // Right should come first (we know `left` isn't "M") 
 
     return 1; 
 
    } 
 
    // Default comparison 
 
    return left.localeCompare(right); 
 
}); 
 

 
// Show result 
 
console.log(theArray);

1

你可以使用一個命令對象設置優先級。

var array = ['z', 'r', 's', 'm', 'b', 'q', 'w', 'c', 'd', 'g', 'p', 'o', 't', 'k', 'n', 'i', 'j', 'a', 'y', 'x']; 
 
array.sort(function (a, b) { 
 
    var ORDER = { m: 1, M: 1 }; 
 
    return !ORDER[a] - !ORDER[b] || a.localeCompare(b); 
 

 
}); 
 
    
 
console.log(array);

+0

如果你想按順序指定更多的東西,那麼該怎麼辦:'{m:1,M:1,x:2,w:3}' – nnnnnn

+0

你可以採取類似'(ORDER [a.status] || 0) - (ORDER [b.status] || 0);'具有零默認值的適當值,取決於優先權。 –

+0

好的;好主意...... – nnnnnn

-1

除了應用自定義比較的排序功能,你可以只移動後的字符。

var a = ['b','c','d','m','a']; 
 
var b = a.sort(); 
 
var c = ["m",...b.join``.replace("m","")]; 
 
console.log(c);

b.join``陣列轉換成字符串,.replace("m","")去除m...的字符串返回陣列(這是spread operator)並連接"m"轉換它。

+0

爲什麼downvote?我誤解了什麼?我的答案似乎產生了正確的輸出,不是嗎? – nicael

+0

dv不是來自我的,但它不是排序,而是重新組裝。 –

+0

它只是更短,更易於理解。這完全是一種更「更清潔」的方式。 – nicael

0

這裏的,如果你需要更多的情況下,而不是僅僅一個字母是自由擴展的解決方案:

var alfabetPriority = "mabcdefghijklnopqrstuvwxyz"; 
 
var letters = ['b','c','d','m','a']; 
 

 
letters.sort(function(left, right) { 
 
    return alfabetPriority.indexOf(left) - alfabetPriority.indexOf(right); 
 
}); 
 

 
console.info(letters.join(',')); // gives: m,a,b,c,d

什麼是發生在這裏的是,是基於其在指數排序中的字符優先列表。這將適用於任何UTF-8字符。您可以根據需要更改優先級,包括多個字母。

如果您要對單詞進行排序,則應用同樣的原則,在這種情況下,您將擁有一組表示優先級的單詞,而不是一串字符。

這樣做的缺點可能是性能,但除非你要這麼做數千次,並且需要對大量字符進行排序,否則你不會注意到其中的差異。

+1

*「到目前爲止所有的答案都不能很好地擴展......」*通過反覆重複搜索字符串'indexOf',以上比例尺比其他答案更糟糕。至於「M」是硬編碼的:這是由OP規定的。 –

+0

作爲解決方案的規模,而不是性能@ T.J.Crowder。對於需要不同優先級的每個字母,代碼不必用'if-else'結構進行修改。 –

+0

好的。 OP詢問如何讓一件特別的事情發生,所以對於回答這個問題的答案是合理的(而不是遠程「無用」)。 –