---
# System prepended metadata

title: Codewars刷題 21~30
tags: [codewars]

---

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