###### tags: `JavaScript`
# [week 2] JavaScript - 綜合題目練習 Lv1
## 練習一:印出一到九
請你分別用 for loop 以及 while 迴圈,印出 1~9。
預期輸出:
```
1
2
3
4
5
6
7
8
9
```
解法:
```
// for loop
for (var i = 1; i<=9; i++) {
console.log(i)
}
// while 迴圈
var i =1
while (i<=9) {
console.log(i)
i++
}
// do while 迴圈
var i = 1
do {
console.log(i)
i++
} while (i<=9)
```
## 練習二:寫一個能夠印出 1~n 的函式
請寫一個函式叫做 print,接收一個是數字的參數 n,並且印出 1~n。
```
print(1) 預期輸出:
1
print(3) 預期輸出:
1
2
3
print(9) 預期輸出:
1
2
3
4
5
6
7
8
9
```
解法:
```
function print(n) {
for(var i=1; i<=n; i++){
console.log(i)
}
}
print(n)
```
## 練習三:寫一個能夠印出 n 個 * 的函式
寫一個函式 star,接收一個參數 n,並印出 n 個 *
(禁止使用內建函式 repeat)
```
star(1) 預期輸出:
*
star(5) 預期輸出:
*****
star(10) 預期輸出:
**********
```
解法:
```
function star(n) {
var answer = ''
for (var i = 1; i <= n; i++) {
answer += '*'
}
console.log(answer)
}
star(5) // 印出 *****
```
由此題可實作出 `repeat()` 函式:
```
function star(str, n) {
var answer = ''
for (var i = 1; i <= n; i++) {
answer += str
}
console.log(answer)
}
star('*', 7) // 印出 *******
```
## 練習四:寫一個能回傳 n 個 * 的函式
請寫出一個叫做 star 的 function 並且接受一個參數 n,能回傳 n 個 *。
```
star(1) 會回傳 *
star(5) 會回傳 *****
所以 console.log(star(5)) 的預期輸出是:
*****
```
解法:
```
var answer = ""
function star(n) {
for (var i = 1; i <= n; i++) {
answer += "*"
}
return answer
}
console.log(star(5)) // 印出 *****
```
## 練習五:判斷大小寫
請寫一個叫做 isUpperCase 的 functuon,並且接收一個字串,回傳這個字串的第一個字母是否為大寫。
```
isUpperCase("abcd") 正確回傳值:false
isUpperCase("Abcd") 正確回傳值:true
isUpperCase("ABCD") 正確回傳值:true
isUpperCase("aBCD") 正確回傳值:false
```
解法:
```
function isUpperCase(str) {
var char = str[0]
if (char >= "A" && char <= "Z"){
return true
} else {
return false
}
}
console.log(isUpperCase("abcd")) // 印出 false
console.log(isUpperCase("Abcd")) // 印出 true
// 又可簡化如下:
function isUpperCase(str) {
var char = str[0]
return char >= "A" && char <= "Z"
}
// 透過邏輯運算,可直接回傳 true or false,就不需重複寫出判斷式
```
## 練習六:回傳第一個大寫字母以及它的 index
請寫一個 function position,接收一個字串並回傳這個字串裡面的第一個大寫字母跟它的 index,若沒有則回傳 -1。
```
position("abcd") 正確回傳值:-1
position("AbcD") 正確回傳值:A 0
position("abCD") 正確回傳值:C 2
```
解法:
```
function position(str) {
for (var i=0; i<= str.length; i++) {
if (str[i] >= "A" && str[i]<= "Z") {
return str[i] + ' ' + i // 字母 + 空格 + index
}
}
return -1 // 注意不能寫在迴圈裡
}
```
## 練習七:回傳陣列裡面所有小於 n 的數的數量
請寫出一個函式 findSmallCount,接收一個陣列跟一個數字 n,回傳有多少個數小於 n。
```
findSmallCount([1, 2, 3], 2) 預期回傳值:1
findSmallCount([1, 2, 3, 4, 5], 0) 預期回傳值:0
findSmallCount([1, 2, 3, 4], 100) 預期回傳值:4
```
解法:
```
// 檢查陣列中每個數字是否小於 n:
function findSmallCount(arr, n) {
var counter = 0
for (var i = 0; i < arr.length; i++) {
if (arr[i] < n){
counter++
}
}
return counter
}
```
```
// 或使用 filter() 函數:
function findSmallCount(arr, n) {
return arr.filter(function(item) {
return item < n // 所有小於 n 的數
}).length // 所有小於 n 的數的數量
}
```
## 練習八:回傳陣列裡面所有小於 n 的數的總和
請寫一個函式 findSmallerTotal,接收一個陣列以及數字 n,回傳陣列裡面所有小於 n 的數的總和。
```
findSmallerTotal([1, 2, 3], 3) 正確回傳值:3
findSmallerTotal([1, 2, 3], 1) 正確回傳值:0
findSmallerTotal([3, 2, 5, 8, 7], 999) 正確回傳值:25
findSmallerTotal([3, 2, 5, 8, 7], 0) 正確回傳值:0
```
解法:
```
function findSmallerTotal(arr, n) {
var total = 0
for (var i = 0; i < arr.length; i++) {
if (arr[i] < n) {
total += arr[i]
}
}
return total
}
```
## 練習九:回傳陣列裡面所有小於 n 的數
請寫一個函式 findAllSmall,接收一個陣列跟一個數字 n,回傳一個裡面有所有小於 n 的數的陣列(需按照原陣列順序)。
```
findAllSmall([1, 2, 3], 10) 正確回傳值:[1, 2, 3]
findAllSmall([1, 2, 3], 2) 正確回傳值:[1]
findAllSmall([1, 3, 5, 4, 2], 4) 正確回傳值:[1, 3, 2]
```
解法:
```
function findAllSmall(arr, n) {
var answer = []
for (var i = 0; i < arr.length; i++) {
if (arr[i] < n) {
answer.push(arr[i])
}
}
return answer
}
```
```
// 或使用 filter() 函數:
function findAllSmall(arr, n) {
return arr.filter(function (item) {
return item < n
})
}
```
## 練習十:回傳陣列總和
請寫一個 function sum,接收一個陣列並回傳陣列中數字的總和。
```
sum([1, 2, 3]) 預期回傳值:6
sum([-1, 1, 2, -2, 3, -3]) 預期回傳值:0
```
解法:
### 方法一
```
function sum(arr) {
var total = 0
for (var i = 0; i < arr.length; i++) {
total += arr[i]
}
return total
}
```
### 方法二
也可利用 `.reduce(function)` 來解題,reduce() 函式作用如下:
```
function(accumulator, currentValue) {
return currentValue + accumulator
}
accumulator(累積器):記憶起來的變數
currentValue:現在的值
在這個函式 return 的值,會成為下一個 accumulator 參數
```
以練習時為例:
```
function sum(arr) {
return arr.reduce (function(accumulator, value) {
return accumulator + value
})
}
sum([1, 2, 3]) // 回傳 6
sum([-1, 1, 2, -2, 3, -3]) // 回傳 0
```
也可設定 accumulator 的初始值,預設值為 0:
```
function sum(arr) {
return arr.reduce (function(accumulator, value) {
return accumulator + value
}, 10) // 初始值為 10
}
sum([1, 2, 3]) // 回傳 16
sum([-1, 1, 2, -2, 3, -3]) // 回傳 10
```
### 方法三
也可以使用 `forEach()` 來解題,和 `map()` 類似,兩種函式均可「用來存取陣列中的每個元素」。差別在於 `forEach()` 不用進行 return。
而這個方法和 `reduce()` 的差異在於「需在外部宣告變數」,用來存取狀態。
```
function sum(arr) {
var total = 0 // 宣告變數
arr.forEach(function(value) {
total += value
})
return total
}
```
拿掉宣告變數,並在 function 增加參數來存取,就變成 `reduce()` 函式了:
```
function sum(arr) {
return arr.reduce(function(total, value) {
return total + value // 用 return 來存取 total 的值
})
}
```