說我有一個隨機順序的所有26個字母的數組。我知道如何按字母順序使用Array.sort()
函數進行排序。但是,如果我想要一個特定的字母表「M」作爲列表中的第一個,然後按字母順序排列其餘字母,我該如何排序。JavaScript數組按一定標準排序
目前我所做的是將數組中的「M」拼接起來,然後在排序後我將它移回列表中。這樣做還行嗎?還是有更清潔的方法來做到這一點?
例子:
未分類:['b','c','d','m','a']
排序:['m','a','b','c','d']
說我有一個隨機順序的所有26個字母的數組。我知道如何按字母順序使用Array.sort()
函數進行排序。但是,如果我想要一個特定的字母表「M」作爲列表中的第一個,然後按字母順序排列其餘字母,我該如何排序。JavaScript數組按一定標準排序
目前我所做的是將數組中的「M」拼接起來,然後在排序後我將它移回列表中。這樣做還行嗎?還是有更清潔的方法來做到這一點?
例子:
未分類:['b','c','d','m','a']
排序:['m','a','b','c','d']
正在做的這樣好,還是有一個更清潔的方式做到這一點?
這是好的,但如果你願意,你可以自定義排序: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);
你可以使用一個命令對象設置優先級。
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);
除了應用自定義比較的排序功能,你可以只移動後的字符。
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"
轉換它。
這裏的,如果你需要更多的情況下,而不是僅僅一個字母是自由擴展的解決方案:
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字符。您可以根據需要更改優先級,包括多個字母。
如果您要對單詞進行排序,則應用同樣的原則,在這種情況下,您將擁有一組表示優先級的單詞,而不是一串字符。
這樣做的缺點可能是性能,但除非你要這麼做數千次,並且需要對大量字符進行排序,否則你不會注意到其中的差異。
*「到目前爲止所有的答案都不能很好地擴展......」*通過反覆重複搜索字符串'indexOf',以上比例尺比其他答案更糟糕。至於「M」是硬編碼的:這是由OP規定的。 –
作爲解決方案的規模,而不是性能@ T.J.Crowder。對於需要不同優先級的每個字母,代碼不必用'if-else'結構進行修改。 –
好的。 OP詢問如何讓一件特別的事情發生,所以對於回答這個問題的答案是合理的(而不是遠程「無用」)。 –
添加未排序字符串和已排序字符串的示例。 –
您目前的做法似乎比實際實現自己的排序算法更好。 – str
剛剛添加@str所說的內容。 –