實作字串內建函式

自己做做看。

String.repeat

1
2
3
4
5
6
7
8
function repeat(str, times) {
var result = ''
for(var i=0; i<times; i++) {
result += str
}
return result
}
console.log(repeat('a', 5)) // aaaaa

String.trim

解法 1 => 找出頭尾的索引值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function trim(s) {
// 結果字串
let result = ''
// 儲存起點位置
let first = 0
// 儲存終點位置
// 要注意輸入為 ' ' 的 edge case
let last = s.length - 1

// 找出從前面數來第一個非空白字元的索引值
for(let i=0; i<s.length; i++) {
if(s[i] !== ' ') {
first = i
break
}
}
// 找出從後面數來第一個非空白字元的索引值
for(let i=s.length-1; i>=0; i--) {
if(s[i] !== ' ') {
last = i
break
}
}
// 組合字串
// 注意要 <= 才能取到終點位置字元
for(let i=first; i<=last; i++) {
result += s[i]
}
return result
}
console.log(trim(' abc ')) // abc
console.log(trim(' a b c ')) // abc
console.log(trim(' abc')) // abc
console.log(trim('abc ')) // abc

解法 2 => 先去掉前面的空白,再去掉後面的空白:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function trim(s) {
// 儲存狀態
let isFrontWhiteSpaceFounded = false
// 儲存狀態
let isBackWhiteSpaceFounded = false
// 儲存去掉前面空白後的字串
let front = ''
// 儲存去掉後面空白後的字串
let back = ''
// 先去掉前面的空白
for(let i=0; i<s.length; i++) {
// 第一個非空白字元找到後,isFrontWhiteSpaceEnd 會變 true
// 所以接下來出現的空白字元也都會被填入
if(s[i] !== ' ' || isFrontWhiteSpaceFounded) {
front += s[i]
isFrontWhiteSpaceFounded = true
}
}
// 接著去掉後面的空白
for(let i=front.length-1; i>=0; i--) {
// 第一個非空白字元找到後,isBackWhiteSpaceFounded 會變 true
// 所以接下來出現的空白字元也都會被填入
if(front[i] !== ' ' || isBackWhiteSpaceFounded) {
// 順序要這樣才會對,不然會變成顛倒文字
back = front[i] + back
isBackWhiteSpaceFounded = true
}
}
return back
}
console.log(trim(' abc ')) // abc
console.log(trim(' a b c ')) // abc
console.log(trim(' abc')) // abc
console.log(trim('abc ')) // abc

String.toLowerCase

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function toLowerCase(s) {
let result = ''
for(let i=0; i<s.length; i++) {
// 如果是大寫字母
if(s[i]>='A' && s[i]<='Z') {
// 轉成小寫
result += String.fromCharCode(s[i].charCodeAt(0) + 32)
} else {
// 不是大寫字母不做處理
result += s[i]
}
}
return result
}
console.log(toLowerCase('ZZVa asS a C AsABC!!!!')) // zzva ass a c asabc!!!!
console.log(toLowerCase('!!!!')) // !!!!
console.log(toLowerCase(' ')) // ' '

String.endsWith

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function endsWith(str, searchString) {
// 搜尋字串長度 > 比對字串長度
// 搜尋字串為空字串
if(searchString.length > str.length || searchString.length === 0) return false
// 儲存搜尋字串最後一個字的索引值
let k = searchString.length - 1
// 反向迴圈
for(let i=str.length-1; i>=0; i--) {
// 比對兩字串的倒數第 n 個字是否相同
if(str[i] !== searchString[k--]) return false
// 沒有字可以比了
if(k < 0) break
}
// 符合
return true
}
console.log(endsWith('abc', 'c')) // true
console.log(endsWith('abc', 'bc')) // true
console.log(endsWith('abc', 'abc')) // true
console.log(endsWith('abc', 'aaabc')) // false
console.log(endsWith('abc', '')) // false

String.padEnd

解法 1 => 直接把填充文字填入,最後再把多餘的部分去掉:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function padEnd(str, targetLength, padString=' ') {
// 長度 <= 原字串
// 填入文字為空字串
if(
targetLength <= str.length ||
!(padString)
) return str
// 結果字串
let result = ''
// 未達到目標長度時不會停止
while(str.length < targetLength) {
// 填入文字
str += padString
}
// 去掉超出範圍的文字
for(let i=0; i<targetLength; i++) {
result += str[i]
}
return result
}
console.log(padEnd('abc', 10, 'a')) // abcaaaaaaa
console.log(padEnd('abc', 10, 'dog')) // abcdogdogd
console.log(padEnd('abc', 2, 'abbc')) // abc
console.log(padEnd('abc', 2, '')) // abc
console.log(padEnd('abc', 5)) // 'abc '

解法 2 => 把填充文字一個字一個字加入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function padEnd(str, targetLength, padString=' ') {
// 長度 <= 原字串
// 填充文字為空字串
if(
targetLength <= str.length ||
!(padString)
) return str
// 動態索引值
let k = 0
// 未達到目標長度時不會停止
while(str.length < targetLength) {
// 填入文字
str += padString[k++]
// 已經是填充文字的最後一個字,歸零
if(k === padString.length) k=0
}
// 回傳結果
return str
}
console.log(padEnd('abc', 10, 'a')) // abcaaaaaaa
console.log(padEnd('abc', 10, 'dog')) // abcdogdogd
console.log(padEnd('abc', 2, 'abbc')) // abc
console.log(padEnd('abc', 2, '')) // abc
console.log(padEnd('abc', 5)) // 'abc '

String.slice

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function slice(str, start, end) {
// 沒有 end 值,設為字串長度
if(!end) end = str.length
// 結果
let result = ''
// 根據 start end 範圍擷取文字
for(let i=start; i<end; i++) {
result += str[i]
}
// 回傳結果
return result
}
console.log(slice('abcdefg', 0, 3)) // abcd
console.log(slice('abcdefg', 3, )) // defg
mentor-program-day10 Chorme-devtool 的冷知識
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×