--- title: Codewars刷題 21~30 tags: codewars, description: --- Codewars刷題 21~30 === 21.Filter the number - 把字串中的阿拉伯數字回傳 --- **把字串中的阿拉伯數字回傳** - `.split('')`先把字串拆成陣列,`.filter()`再把`item`取出用條件式判斷。 - 取出的`item`跟轉型後的`item`做寬鬆比較`==`, 為`true`的被挑選出來成為新陣列。 - `.join('')`再把新陣列內的所有內容,結合為一個字串。 - 加上`+`把`string`型別數字轉成`number`型別。 ```javascript= let value = '1.203'; var filterString = function (value) { return +value.split('').filter(item => item == +item).join(''); }; console.log(filterString(value)); ``` **正則表達式解法:** - 全域比對:`/ /g` - 數字:`\d` - 非數字:`\D` ```javascript= var filterString = function(value) { return +value.match(/[0-9]/g).join(''); } ``` - 字元至少出現1次:`+` ```javascript= let value = '1.2f0f3'; var filterString = function (value) { return +value.match(/\d+/g).join(''); } console.log(filterString(value)); ``` **延伸閱讀** - [JavaScript match() 方法](https://www.w3school.com.cn/jsref/jsref_match.asp) <br> 22.Testing 1-2-3 - 測試 1-2-3 --- **讓列表內的值添加有序數字,並注意冒號和空格。如下:** :::info [] --> [] ["a", "b", "c"] --> ["1: a", "2: b", "3: c"] ::: - 匿名函式代入陣列參數,進行`.map()`,把陣列item取出**修改內容後`return`**,再把`.map()`調整過的陣列回傳。 - 把匿名函式的回傳陣列**賦予**給變數`number`。 ```javascript= var number = function (array) { return array.map((item, index) => `${index + 1}: ${item}`); }; console.log(number(["a", "b", "c"])); ``` <br> 22.Count Odd Numbers below n - 找尋 n 以下的偶數數量 --- **將數字代入函式內,尋找數字以下的奇數(odd)數量。** - 代入數字的參數`n`除以`2`,再用`.parseInt()`**取整數**後`return`。 ```javascript= function oddCount(n) { return parseInt(n / 2); }; console.log(oddCount(14)); ``` - 也可以用`Math.floor()`,會回傳==小於等於==所給數字的**最大整數**。 ```javascript= function oddCount(n){ return Math.floor(n / 2); } ``` **延伸閱讀** - [Math.floor()](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Math/floor) <br> 23.String Scramble - 字串重組 --- #### 給定一個字串和一個有索引數值的陣列,將字串依照索引陣列中對應的索引值重組順序。 例如:`scramble('abcd', [0,3,1,2])` -> `'acdb'` - 把參數`arr`,做`forEach()`。 - `forEach()`進行時,`result`代入`[item]`,作為 ==`result`的index==。 - 參數`str`的字串**解構**`[...str]`為陣列代入`[index]`,作為 ==`result`的index的value==。 - result陣列`join('')`組成字串後`return`。 ```javascript= function scramble(str, arr) { let result = []; arr.forEach((item, index) => { result[item] = [...str][index]; }); return result.join(''); }; console.log(scramble('abcd', [0, 3, 1, 2])); ``` - 另解使用`reduce` 依照`index`的順序0、1、2、3,找出`item值`。透過`item值`==找出該位置的字串==,並==累加重組==。 - `arr.indexOf()`把`index`代入,回傳arr的`index`位置。 - `str[]`把arr的`index`位置代入,找到該字串字元。累加在`rebuildStr`。 - `rebuildStr`初始值是`''`。 ```javascript= function scramble(str, arr) { return arr.reduce((rebuildStr, __, index) => rebuildStr + str[arr.indexOf(index)], ''); }; console.log(scramble('abcd', [0, 3, 1, 2])); // acdb ``` <br> 23.Make the Deadfish Swim - 讓死魚游泳 --- #### 要讓死魚游泳,必須要符合以下五個規則 - 如果遇到 "i" ,就+1 (初始值為0)。 - 如果遇到 "d" ,就-1。 - 如果遇到 "s" ,就平方。 - 如果遇到 "o" ,就返回陣列。 - 其他額外的字母請忽略。 #### 解法 - 將代入參數`data`,解構成陣列`[...data]`,進行`forEach()`。 - 進行`forEach()`把`item`用**三元運算子**判斷,若符合對應的英文字母就進行`true`的動作。若為`false`就進行下一個字母判斷,一個**判斷式**串一個**判斷式**下去。 ```javascript= function parse(data) { let num = 0; let result = []; [...data].forEach(item => { item === 'i' ? num ++ : item === 's' ? num = Math.pow(num, 2) : item === 'd' ? num -- : item === 'o' ? result.push(num) : ``; }); return result; // [8, 64] }; ```