我在上一篇文章對JS遍歷資料的方法做了總結,現在趁著這個題目實戰一下。
方案一
最常規的思路:用變數儲存目標字母和個數,迴圈遍歷不斷更新結果。知識點:
- new Set(arr) //Set去重,目標字串長的話去重還是有必要的
- Array.filter() // 篩選得到符合條件的新陣列
const testStr = "aaaadddddssssgdhssssbbbbbuuuwmopqlsabcfwsqdghgukssuyutsudddddsasss" //其後方案均使用該測試資料
// 統計字串中出現最多的字母與個數
const getStrMax = str => {
const arr = str.split("");//轉成陣列
const arrSet = new Set(arr);//去重
let maxCount = 0;//記錄最大數量
let maxItem = [];//記錄最大數量的字母,考慮到有重複,用了陣列
for (let value of arrSet.values()) {
const count = arr.filter(item => {
return item === value
}).length;
if (count > maxCount) {
maxCount = count;
maxItem = [value];
} else if (count === maxCount) {
maxItem.push(value);
}
}
return {
maxItem,
maxCount
}
}
console.log(getStrMax(testStr))//{ maxItem: [ 's' ], maxCount: 17 }
複製程式碼
方案二
思路:先獲取每個字母出現的個數,再取出個數最多的那個。知識點:
- Array.map() //遍歷原陣列得到想要的新陣列
- [...new Set(arr)] //擴充套件運算子,用於set結構轉陣列
- Array.sort() //陣列排序
//獲取每個字母的數量
const getResult = str => {
const arr = str.split("");//轉成陣列
return [...new Set(arr)].map(value => {
const count = arr.filter(item => {
return item === value
}).length
return {
value,
count
}
})
}
//按count從大到小排序
const result = getResult(testStr).sort((a, b) => {
return b.count - a.count
})
//第一個就是結果
console.log(result[0])
複製程式碼
方案三
思路:同方案二,只是應用reduce方法,減少了程式碼量。知識點:
- Array.reduce() //遍歷陣列並累加指定的資料
- Array.from() //類陣列物件轉陣列
- Object.entries() //物件轉陣列
const getByReduce = str => {
return Array.from(str).reduce((obj, v) => {
const objVal = obj[v] || 0;
objVal === 0 ? obj[v] = 1 : obj[v] = objVal + 1
return obj;
}, {});
}
//轉陣列然後排序
const arr = Object.entries(getByReduce(testStr)).sort((a, b) => {
return b[1] - a[1]
})
console.log(arr[0]);//[ 's', 17 ]
複製程式碼
寫在最後
- 吾愛吾碼,但更愛真理。如有不正確或脫了褲子放屁的操作敬請指出。溫柔些,臉皮薄……
- 如有其他更好、炫酷抑或有趣的方案,歡迎評論留言。