# 二十三、 綜合練習 Lv1
###### tags: `JavaScript` `JS101` `2020七月第三週` `進度筆記` `Lidemy心得` `7/14`
---
## 練習一:請你分別用 for loop 以及 while 迴圈,印出 1~9。
for(var i = 1; i<=9; i++) {
console.log(i)
}
var i = 1
console.log(i)
do {
console.log(i++)
} while(i<=9) {
console.log('i:', i)
}
---
## 練習二:寫一個能夠印出 1~n 的函式
function print(n) {
for (var i=1; i<=n; i++) {
console.log(i)
}
}
print(1)
// 會印出 1
function print(n) {
for (var i=1; i<=n; i++) {
console.log(i)
}
}
print(3)
// 會印出 1 到 3 (隔行)。
function print(n) {
for (var i=1; i<=n; i++) {
console.log(i)
}
}
print(9)
// 會印出 1 到 9 (隔行)。
---
## 練習三:寫一個能夠印出 n 個 * 的函式
function star(n) {
var result = ""
for (var i=1; i<=n; i++) {
result = "*"
console.log(result)
}
}
star(1)
function star(n) {
var result = ""
for (var i=1; i<=n; i++) {
result = "*"
console.log(result)
}
}
star(5)
function star(n) {
var result = ""
for (var i=1; i<=n; i++) {
result = "*"
console.log(result)
}
}
star(10)
---
## 練習四:寫一個能回傳 n 個 * 的函式
star(1) 會回傳 *
star(5) 會回傳 *****
所以 console.log(star(5)) 的預期輸出是:
*****
function star(n) {
var result = ''
for (var i = 1; i<5; i++) {
result = '*'
console.log(result)
}
return result
}
console.log(star(5))
---
## 練習五:判斷大小寫
請寫一個叫做 isUpperCase 的 functuon,並且接收一個字串,
回傳這個字串的第一個字母是否為大寫。
isUpperCase("abcd") 正確回傳值:false
isUpperCase("Abcd") 正確回傳值:true
isUpperCase("ABCD") 正確回傳值:true
isUpperCase("aBCD") 正確回傳值:false
var isUpperCase = "abcd"
console.log(isUpperCase >= 'A' && isUpperCase <= 'Z')
var isUpperCase = "Abcd"
console.log(isUpperCase >= 'A' && isUpperCase <= 'Z')
var isUpperCase = "ABCD"
console.log(isUpperCase >= 'A' && isUpperCase <= 'Z')
var isUpperCase = "aBCD"
console.log(isUpperCase >= 'A' && isUpperCase <= 'Z')
---
## 練習六:回傳第一個大寫字母以及它的 index
請寫一個 function position,接收一個字串並回傳這個字串裡面的第一個大寫字母跟它的 index,若沒有則回傳 -1。
position("abcd") 正確回傳值:-1
position("AbcD") 正確回傳值:A 0
position("abCD") 正確回傳值:C 2
function position(str) {
var indexOfLetter = []
var from = 'A'.charCodeAt(0) // 可以找字母,從 A 找到 Z ;
var to = 'Z'.charCodeAt(0)
for(var i=from; i<=to; i++) {
var char = String.fromCharCode(i)
indexOfLetter.push({
char: char,
index: str.indexOf(char)
})
}
indexOfLetter.sort(function(a, b) {
return a.index -b.index // A 到 Z 數字的排序;
})
indexOfLetter = indexOfLetter.filter(function(item) { // 回傳 . push 後的 obj ;
return item.index >=0 // 找不是 -1 的數字,留下 >= 0 ;
})
if (indexOfLetter.length ===0) {
return -1 // 如果沒有任何大寫字母,因此回傳 -1 ;
}
return indexOfLetter[0].char + ' ' + indexOfLetter[0].index
// 如果有大寫字母就回傳;
}
var a = position('abcd')
console.log(a)
// 比較簡單的寫法,從第一個字開始找,找到大寫後就回傳
function position(str) {
for (var i = 0; i<str.length; i++) {
console.log(str[i])
if (str[i] >='A' && str[i] <='Z') { // 代表大寫字母;
return str[i] + ' '+ i // i 表示 index;
}
}
return -1
// 整個迴圈跑完後看字串沒有大寫字母就回傳 -1 , 有的話就照大寫字母順序回傳順位 0, 1, 2... ;
}
var a = position('abcd')
console.log(a)
---
## 練習七:回傳陣列裡面所有小於 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
// 找出最小值後印出第一個數字
function findSmallCount(arr, n) {
var counter = 0
for(var i=0; i<arr.length; i++) {
if (arr[i] < n) counter++
}
return counter
}
console.log(findSmallCount([1, 2, 3], 2))
console.log(findSmallCount([1, 2, 3, 4, 5], 0))
console.log(findSmallCount([1, 2, 3, 4], 100))
function findSmallCount(arr, n) {
return arr.filter(function(item) {
return item < n
}).length
}
console.log(findSmallCount([1, 2, 3], 2))
console.log(findSmallCount([1, 2, 3, 4, 5], 0))
console.log(findSmallCount([1, 2, 3, 4], 100))
---
## 練習八:回傳陣列裡面所有小於 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 sum = 0
for(var i=0; i<arr.length; i++) {
if (arr[i] < n) sum+=arr[i]
}
return sum
}
console.log(findSmallerTotal([1, 2, 3], 3))
console.log(findSmallerTotal([1, 2, 3], 1))
console.log(findSmallerTotal([3, 2, 5, 8, 7], 999))
console.log(findSmallerTotal([3, 2, 5, 8, 7], 0))
---
## 練習九:回傳陣列裡面所有小於 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]
// 也可以用 .filter
function findAllSmall(arr, n) {
var small = []
for(var i=0; i<arr.length; i++) {
if (arr[i] < n) {
small.push(arr[i])
}
}
return small
}
console.log(findAllSmall([1, 2, 3], 10))
console.log(findAllSmall([1, 2, 3], 2))
console.log(findAllSmall([1, 3, 5, 4, 2], 4))
---
## 練習十:回傳陣列總和
請寫一個 function sum,接收一個陣列並回傳陣列中數字的總和。
sum([1, 2, 3]) 預期回傳值:6
sum([-1, 1, 2, -2, 3, -3]) 預期回傳值:0
accumulator 的初始值會是陣列的第一個元素,詳情可參考 [MDN](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)
function sum(arr) {
var ans = 0
for(var i=0; i<arr.length; i++) {
ans += arr[i]
}
return ans
}
console.log(sum([1, 2, 3]))
console.log(sum([-1, 1, 2, -2, 3, -3]))
---
### `.reduce`
用 array 的時候背後通常有參數,就是現在的 value 和 index ,
會是:
function(accumulator, currentValue) {
return currentValue + accumulator
}
表示跑迴圈時,我對第一個元素用的時候,我回傳我現在的元素 + 累積起來的值,因此跑完後會累積起來成為總和。
[1, 2, 3].reduce(sum)
對 1 執行函數時 accumulator 是 null , currentValue 是 1
return currentValue + accumulator 會是 1 。
對第二圈開始跑的時候,對 2 執行函數時 accumulator 是 1 , currentValue 是 2
return currentValue + accumulator 會是 3 。
第三圈開始跑的時候,對 3 執行函數時 accumulator 是 3, currentValue 是 3
return currentValue + accumulator 會是 6 。
範例:
function sum(arr) {
return arr.reduce(function(accumulator, value) {
// reduce 有點像是把 ans 的值放到 accumulator 的位置;
return accumulator + value
}, 10) // 10 是初始值;
}
console.log(sum([1, 2, 3]))
console.log(sum([-1, 1, 2, -2, 3, -3]))
加上初始值跑出來就是 10 跟 16 。
也可以這樣,跑出 total 的值:
function sum(arr) {
return arr.reduce(function(total, value) {
return total + value
})
}
console.log(sum([1, 2, 3]))
console.log(sum([-1, 1, 2, -2, 3, -3]))
其想要把第一個參數存起來變成可以記得的狀態。
變種:
console.log(
[1, 2, 3].reduce(
function(obj, value) {
obj['a'+value] = value
return obj
}, {}
)
)
--
### 用 `.map` 也行
function sum(arr) {
var ans = 0
arr.map(function(value) {
ans = ans + value
return value
})
return ans
}
console.log(sum([1, 2, 3]))
console.log(sum([-1, 1, 2, -2, 3, -3]))
### 還有 `.forEach` 跑每個元素
但他不用 return 值回來:
function sum(arr) {
var ans = 0
arr.forEach(function(value) {
ans = ans + value
return value
})
return ans
}
console.log(sum([1, 2, 3]))
console.log(sum([-1, 1, 2, -2, 3, -3]))