---
# System prepended metadata

title: 二十三、 綜合練習 Lv1
tags: [JS101, Lidemy心得, 2020七月第三週, 進度筆記, 7/14, JavaScript]

---

# 二十三、 綜合練習 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]))
