iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
自我挑戰組

解三十天的 CodeWars系列 第 28

Most frequently used words in a text

  • 分享至 

  • xImage
  •  

CodeWars 題目

Link

難度

4 kyu

題目

函數參數傳入一個文字字串,回傳出現次數最多的前 3 個單字的陣列,按出現次數降序排列。
除了撇號 之外的所有符號與空格都無視,主要驗證的是英文字母字元,並且結果輸出為小寫。

實作

function topThreeWords(text) {
	let workArr = text.toLowerCase()
		.replace(/([^a-z| ])([^'a-z|a-z'])/g, " ")
		.trim()
		.split(" ");
	workArr = workArr.filter(item => item.length > 0)

	let counter = {};
	for (let i = 0; i < workArr.length; i++) {
		if (counter[workArr[i]]) {
			counter[workArr[i]]++
		} else {
			counter[workArr[i]] = 1;
		}
	}

	let result = Object.entries(counter)
		.sort((a, b) => b[1] - a[1])
		.slice(0, 3)
		.map(item => item.splice(0, 1));
	return [].concat(...result);
}

由於輸出的結果為小寫,第一步先把字串轉為全小寫。
replace 取代方法是為了清除掉題目本身不承認的符號,取代成空格字符。

([^a-z| ]):捕獲不是小寫字母和空格的字符。
([^'a-z|a-z']):捕獲撇號不是出現在 a-z 的前後。

例如參數傳入:" //wont won't won't “,斜線就會被 match 到;trim 清除掉頭尾空白,split 把字串拆分成陣列。

宣告 counter 物件來紀錄單詞的出現次數,以 [key, value] 的形式轉成陣列,並且依照 value 來排序,slice 擷取前三個,splice 返回指定內容,最後與空陣列拼接。


上一篇
Build Tower
下一篇
Pick peaks
系列文
解三十天的 CodeWars30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言