# 十九、 陣列 (array) 相關內建函式 ###### tags: `JavaScript` `JS101` `2020七月第三週` `進度筆記` `Lidemy心得` `7/14` --- ## 1. 人體蜈蚣 用 `.join` 把陣列的每個元素用想要的字串接在一起: var arr = [1, 2, 3] console.log(arr.join('!')) 頭尾不會有 ! , 是在陣列空格內接上,會印出: 1!2!3 。 如果無指定,預設值為空白,會直接把陣列內的所有字元印出。 --- ## 2. 要記得看小地圖才不會被 gank `.map()` 可以把每個元素傳入: var arr = [1, 2, 3] // 宣告陣列賦給 arr ; 然後最後一行的 .map 讓陣列元素代入下行函式; function double(x) { // 這時候的 x 為 1 2 3 , 並根據函式 內計算 * 2後回傳; return x*2 } console.log(arr.map(double)) `.map` 可以讓第一行陣列中每個元素,代入 `(arr.map(double))` 內,然後將回傳值取代原本的值,因此會印出 [ 2, 4, 6 ] 。 如果是匿名函式的作法: var arr = [1, 2, 3] console.log(arr.map(function (x) { return x*2 })) 一樣印出 [ 2, 4, 6 ] 。 陣列內還可以接東西: var arr = [1, 2, 3] console.log( arr .map(function (x) { return x*-1 }) .map(function(x) { return x*2 }) ) 會印出印出 [ -2, -4, -6 ] ; `.map` 可以一直接下去 。 --- ## 3. 濾水器 也可以回傳一個 array 的作法: `.filter` 可以過濾東西,回傳 true 的值會留下,而剔除 false 。 var arr = [1, 2, 3, -2, 3, -5] console.log( arr .map(function(x) { return x*2 }) .filter(function(x) { return x>0 }) ) 會印出 [ 2, 4, 6, 6 ] ,去掉了負值。 也可以 `.map()` `.filter` 接下去,但不能 `.filter` 後接 `.join` 如: `.filter` 可以過濾東西,回傳 true 的值會留下,而剔除 false 。 var arr = [1, 2, 3, -2, 3, -5] console.log( arr .map(function(x) {return x}) .filter(function(x) {return x}) .join(function(x) {return x}) // .join 回傳的是字串,而字串沒有 .map 的函式,所以不能接在 .filter 後; --- ## 4. 我只想要一塊蛋糕 想要陣列的某個部分,會從索引值所要求的部分開始切,記得陣列的起始值是 0 : var arr = [0, 1, 2, 3, 4, 5, 6] console.log(arr.slice(3)) 會回傳陣列並印出 [ 3, 4, 5, 6 ] , 傳數字 3 表示 含 3 以後的數字全都要~ 如果這樣: var arr = [0, 1, 2, 3, 4, 5, 6] console.log(arr.slice(3, 4)) 只會印出 [3] ,表示從第三個開始切,但切到第四個不要,因此只保留數字 3。 --- ## 5. 增加或減少排隊的人數 會改變原本的陣列並加入或刪除新元素 `array.splice(startp[, deleteCount[, item1[, item2[, ...]]]])` : 以 MDN 範例說明: const months = ['Jan', 'March', 'April', 'June']; months.splice(1, 0, 'Feb'); // months.splice(1, 0, 'Feb') , 括號 1 表示在 1 位插入 Feb 字串 , 0 表示不刪除; console.log(months); // 會輸出 Array : ["Jan", "Feb", "March", "April", "June"] months.splice(4, 1, 'May'); // 表示在第 4 位後插入 May 字串,且刪除 1 個字串; console.log(months); 會輸出一個 Array : ["Jan", "Feb", "March", "April", "May"] --- ## 6. 整理房間吧 ### 根據 MDN 的範例`.sort()` 可以使陣列排序: const months = ['March', 'Jan', 'Feb', 'Dec']; months.sort(); console.log(months); 會根據英文字母順序輸出 ["Dec", "Feb", "Jan", "March"] 。 ### 無法照數字大小排的情況 const array1 = [1, 30, 4, 21, 100000]; array1.sort(); console.log(array1); 按照順序 1, 2, 3... 會變成字串的類型來排 [1, 100000, 21, 30, 4] ### 如果要照數字比大小 需要用另一個函式 `.aort[compareFunction]` : #### 這是一般照字串排列的情況: var arr = [1, 30, 4, 21] arr.sort() console.log(arr) 會照字串順序排成 [ 1, 21, 30, 4 ] #### 如果用 if 的由小排到大的話: var arr = [1, 30, 4, 21] arr.sort(function(a, b) { if (a===b) return 0 if (b>a) return -1 return 1 }) console.log(arr) 規則如下: 1. `arr.sort(function(a, b)) {` 會回傳 a, b 兩值,規則是如果相等的話; `if (a===b) return 0` 要回傳 0 , 代表相等; 這函式是在告訴 sort 要如何排數字。 2. 如果要 a, b 互換位置的話,就回傳 1 ,不是的話則回傳 -1 ; 假設 a=1 , b=4 , 則不想互換位置,所以 `if b>a return -1` 。 3. 可以想像 a 在前面 , b 在後面,如果相等的話就回傳 0 ,如果想要換位置就回傳 1 ,否則回傳 -1 ; 正數的話會換位置,不一定要 1 , 負值則不會換位 , 0 是相等。 #### 如果是由大排到小: var arr = [1, 30, 4, 21] arr.sort(function(a, b) { if (a===b) return 0 // 不用邏輯運算的話會自動判斷帶入下一行; if (a>b) return -1 return 1 // 回傳任一正數都行,這邊輸入 >=0 的數皆可; }) console.log(arr) a>b 表示由大排到小,則不換位置 return -1 , 不然就回傳 1 。 #### 也可以用三元運算子 `condition ? exprIfTrue : exprIfFalse` 比較: var arr= [1, 30, 4, 21] arr.sort(function(a, b) { if (a===b) return 0 return (a>b ? -1 : 1) }) console.log(arr) 因此可以由大排到小,印出 [ 30, 21, 4, 1 ] 。 如置換 `return (a>b ? -1 : 0)` 一樣會是 [ 30, 21, 4, 1 ] 。 如果置換 `return (a>b ? 1 : -1)` 則順序相反,由小排到大 [ 1, 4, 21, 30 ] 。 如 `return (a>b ? 0 : -1)` 一樣是 [ 1, 4, 21, 30 ] 。 #### 運用數學概念的大到小排法 var arr = [1, 30, 4, 21] arr.sort(function(a, b) { return b-a }) console.log(arr) 假設 a 是運用兩數相減,會得到正值會換位,因此在前面,會印出 [ 30, 21, 4, 1 ] ; 反之 a-b 則是負值不換位 [ 1, 4, 21, 30 ] 。 推論,我們想由小到大 , if b>a => return -1 → 如果是 a - b 是負數就會滿足這個條件。 if b<a => return 1 → 如果是 a - b 是正數就會滿足這個條件。 [陣列相關函式補充](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)