我有要按自定義順序排序的字串陣列 我的陣列看起來像這樣
["E", "D", "CC", "C", "B", "BB", "BBA", "BBD", "BBE", "BBB", "BBBC", "A", "AA"]
在我的排序陣列中,我想按字母順序顯示單詞,但應首先出現具有大量連續字母的單詞。
如果更多的單詞具有相同長度的連續字母,則需要按字母順序考慮下一個字母。
我的預期結果應該是這樣的
["AA", "A","BBBC", "BBB","BBA", "BBD", "BBE", "BB", "B", "CC", "C", "D", "E"]
我嘗試使用默認的 sort() 函式進行排序,但它沒有給我預期的結果。所以請提出你的建議
uj5u.com熱心網友回復:
好的,這應該做你想要的。它考慮了字串的長度,以及所有字符是否相同,最后按 alpha 排序:
let rawArray = ["E", "D", "CC", "C", "B", "BB", "BBA", "BBD", "BBE", "BBB", "BBBC", "A", "AA"];
rawArray.sort((a,b) => {
if (a.substring(0, 1) === b.substring(0, 1) && allEqual(a) && !allEqual(b)) {
return -1
}
else if (a.length > b.length){
return -1
}
else if (a < b && !allEqual(a b)){
return -1
}
else {
return 1
}
});
function allEqual(input) {
return input.split('').every(char => char === input[0]);
}
console.log(rawArray); //["AA", "A", "BBBC", "BBB", "BBA", "BBD", "BBE", "BB", "B", "C", "CC", "D", "E"]
我利用另一個答案來獲得 allEqual 函式。你可以在這里找到。
您也可以縮短排序功能,但它會降低可讀性:
rawArray.sort((a,b) =>
(a.substring(0, 1) === b.substring(0, 1) && allEqual(a) && !allEqual(b))
||
(a.length > b.length)
||
(a < b && !allEqual(a b))
? -1 : 1
);
uj5u.com熱心網友回復:
我首先撰寫一個函式,將 2 個元素與預期規則進行比較,如果第一個元素應該是第一個元素,則回傳 1,否則回傳 -1,檢查 2 個元素的長度并查看最長的是否從最小的開始(如 in"AAA"和"A")
function myComparer(a, b)
{
if (a.length < b.length)
{
if (b.startsWith(a))
{
return 1; // a should be after b
}
}
else if (a.length > b.length)
{
if (a.startsWith(b))
{
return -1; // b should be after a
}
}
if (a < b)
{
return -1;
}
return 1;
}
const CompareTester = (a, b) => {
if (myComparer(a, b) == -1)
{
console.log(`"${a}" then "${b}"`);
}
else
{
console.log(`"${b}" then "${a}"`);
}
}
const testArr = [
{ a: "AAA", b: "A" },
{ a: "A", b: "AAA" },
{ a: "BBA", b: "BB" },
{ a: "A", b: "B" },
{ a: "ABC", b: "DEF" },
{ a: "ABC", b: "ABCDEF" }
];
for (elem of testArr)
{
CompareTester(elem.a, elem.b);
}
現在,您可以將此函式用作.sort()方法的回呼:
const arr = ["E", "D", "CC", "C", "B", "BB", "BBA", "BBD", "BBE", "BBB", "BBBC", "A", "AA"];
function myComparer(a, b)
{
if (a.length < b.length)
{
if (b.startsWith(a))
{
return 1; // a should be after b
}
}
else if (a.length > b.length)
{
if (a.startsWith(b))
{
return -1; // b should be after a
}
}
if (a < b)
{
return -1;
}
return 1;
}
arr.sort(myComparer);
console.log(arr);
uj5u.com熱心網友回復:
對于這種排序,您需要自己的自定義排序演算法。
var yourArray = ["E", "D", "CC", "C", "B", "BB", "BBB", "A", "AA"]; // Unsorted Array
let customerSort = (arr) =>
{
// This loop is for iterating array
for (var i = 0; i < arr.length; i )
{
// This loop is for comparing each item of the array with all items in array
for (var j = 0; j < arr.length; j )
{
// This condition is for sorting array in alphabetical order
if (arr[i] < arr[j])
{
var x = arr[i];
arr[i] = arr[j];
arr[j] = x;
}
// This condition is for sorting array in the custom order needed
if (arr[i].charAt(0) == arr[j].charAt(0) && arr[i].length > arr[j].length)
{
var x = arr[i];
arr[i] = arr[j];
arr[j] = x;
}
}
}
// Return Sorted Array
return arr;
}
console.log(customerSort(yourArray));
快樂編碼。
uj5u.com熱心網友回復:
挑戰在于理解問題中隱含的排序規則,但我想我可以重申 OP 建議首先按第一個字母的詞匯順序對字串進行排序,然后按第一組重復字符的運行長度排序,然后是整個字串長度,最后是剩余字符的詞法順序。
為了在排序中清楚地顯示該邏輯,此代碼段將輸入字串預處理為物件,例如:
{ input: "BBBC", firstChar: "B", runLength: 3, fallback: "C", length: 4 }
如果一切都正確,那么排序很簡單......
function sortInfo(original) {
const firstLetter = original[0];
const length = original.length;
let runLength = 0;
for (let letter of original) {
if (letter === firstLetter) runLength ;
else break;
}
const fallback = original.slice(runLength)
return { original, firstLetter, runLength, length, fallback }
}
let input = ["E", "D", "CC", "C", "B", "BB", "BBA", "BBD", "BBE", "BBB", "BBBC", "A", "AA"];
let sortable = input.map(sortInfo)
sortable.sort((a,b) => {
if (a.firstLetter !== b.firstLetter) return a.firstLetter.localeCompare(b.firstLetter);
if (a.runLength !== b.runLength) return b.runLength - a.runLength;
if (a.length !== b.length) return b.length - a.length;
return a.fallback.localeCompare(b.fallback);
});
console.log(sortable.map(o => o.original))
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/414917.html
標籤:
上一篇:如何使用JQ將陣列合并為物件陣列
