學習軌道
/
JavaScript
JavaScript
/
練習
/
Elyse 的魔法道具
Elyse 的魔法道具

Elyse 的魔法道具

學習練習

簡介

在 JavaScript 中,陣列是一種類似清單、長度不固定的結構,可以存放任何型別的基本型別或物件,甚至可以混用不同型別。

要建立陣列,請在方括號 [] 之間加入元素。 要從陣列中讀取資料,請把索引放在識別字後面的方括號 [] 裡。 陣列的索引從零開始。

例如:

const numbers = [1, 'two', 3, 'four'];
numbers[2];
// => 3

要取得陣列中元素的數量,請使用 length 屬性:

const numbers = [1, 'two', 3, 'four'];
numbers.length;
// => 4

要修改陣列中的元素,請在該索引位置指定一個值:

const numbers = [1, 'two', 3, 'four'];
numbers[0] = 'one';
numbers;
// => ['one', 'two', 3, 'four']

方法

每個 Array 物件都能使用的一些方法,可以用來在陣列中新增或移除項目。 以下列出幾個在進行這個練習時可以考慮的方法:

push

使用.push(value)可以把value_加入_到陣列的末端。 這個方法會回傳陣列的新長度。

const numbers = [1, 'two', 3, 'four'];
numbers.push(5); // => 5
numbers;
// => [1, 'two', 3, 'four', 5]

pop

使用.pop()可以把_最後一個_value從陣列中_移除_。 這個方法會回傳被移除的值。 因為這項變更,陣列的長度會減少。

const numbers = [1, 'two', 3, 'four'];
numbers.pop(); // => four
numbers;
// => [1, 'two', 3]

shift

使用.shift()可以把_第一個_value從陣列中_移除_。 這個方法會回傳被移除的值。 因為這項變更,陣列的長度會減少。

const numbers = [1, 'two', 3, 'four'];
numbers.shift(); // => 1
numbers;
// => ['two', 3, 'four']

unshift

使用.unshift(value)可以把value_加入_到陣列的開頭。 這個方法會回傳陣列的新長度。

const numbers = [1, 'two', 3, 'four'];
numbers.unshift('one'); // => 5
numbers;
// => ['one', 1, 'two', 3, 'four']

splice

使用.splice(index, 1)可以從陣列中_移除_位於特定index的value。 這個方法會回傳被移除的元素。

const numbers = [1, 'two', 3, 'four'];
numbers.splice(2, 1, 'one'); // => [3]
numbers;
// => [1, 'two', 'one', 'four']
Advanced

這些方法比前面描述的還要強大:

  • push 和 unshift 都允許你一次 push 或 unshift 多個值,只要多傳幾個引數就行。 完成這個練習並不需要這麼做。
  • splice 可以透過加大第二個引數來移除多個值。 完成這個練習並不需要這麼做。
  • splice 也可以在 deleteCount 之後加入多個引數,藉此新增多個值。 這可以用來取代值,或在陣列中間插入值(例如移除 0 個元素時)。 完成這個練習並不需要這麼做。

說明

身為一位見習魔術師,Elyse 需要練習一些基本功。她有一疊牌,想要好好操控它們。

為了讓事情簡單一點,她只用 1 到 10 的卡片,所以她的牌堆可以用一個數字陣列來表示。某張卡片的位置對應到陣列中的索引。也就是說,位置 0 指的是第一張卡片,位置 1 是第二張卡片,依此類推。

Note

除了兩個函式之外,其他函式都應該更新卡片陣列,然後回傳修改後的陣列。這是常見的工作方式,稱為 Builder 模式,讓你可以把函式漂亮地串接起來。

兩個例外是getItem,它應該回傳指定位置的卡片,以及checkSizeOfStack,它應該在指定數量相符時回傳true。

1. 從牌堆中取出一張卡片

要挑一張卡片,請回傳指定牌堆中索引為position的卡片。

const position = 2;
getItem([1, 2, 4, 1], position);
// => 4

2. 交換牌堆中的一張卡片

施展一些手法,把索引為position的卡片和提供的替換卡片交換。 回傳調整後的牌堆。

const position = 2;
const replacementCard = 6;
setItem([1, 2, 4, 1], position, replacementCard);
// => [1, 2, 6, 1]

3. 在牌堆頂端插入一張卡片

在牌堆頂端插入一張新卡片,讓一張卡片出現。 回傳調整後的牌堆。

const newCard = 8;
insertItemAtTop([5, 9, 7, 1], newCard);
// => [5, 9, 7, 1, 8]

4. 從牌堆中移除一張卡片

從牌堆中移除指定position的卡片,讓一張卡片消失。 回傳調整後的牌堆。

const position = 2;
removeItem([3, 2, 6, 4, 8], position);
// => [3, 2, 4, 8]

5. 移除牌堆頂端的卡片

移除牌堆頂端的卡片,讓一張卡片消失。 回傳調整後的牌堆。

removeItemFromTop([3, 2, 6, 4, 8]);
// => [3, 2, 6, 4]

6. 在牌堆底部插入一張卡片

在牌堆底部插入一張新卡片,讓一張卡片出現。 回傳調整後的牌堆。

const newCard = 8;
insertItemAtBottom([5, 9, 7, 1], newCard);
// => [8, 5, 9, 7, 1]

7. 從牌堆底部移除一張卡片

移除牌堆底部的卡片,讓一張卡片消失。 回傳調整後的牌堆。

removeItemAtBottom([8, 5, 9, 7, 1]);
// => [5, 9, 7, 1]

8. 檢查牌堆的數量

檢查牌堆的數量是否等於stackSize。

const stackSize = 4;
checkSizeOfStack([3, 2, 6, 4, 8], stackSize);
// => false
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
JavaScript Exercism

準備好開始 Elyse 的魔法道具 了嗎?

註冊 Exercism,透過 37 個概念159 個練習 和真人引導來學習並精通 JavaScript,全部免費。