---
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]
};
```