JavaScriptでは、配列は長さが決まっていないリストのような構造で、プリミティブでもオブジェクトでも、型が混ざっていても、どんな値でも入れることができます。
配列を作るには、角括弧([])の間に要素を並べます。
配列から値を読み出すときは、識別子のあとに角括弧([])を付けてインデックスを指定します。
配列のインデックスは0から始まります。
たとえば:
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(value)を使うと、配列の末尾にvalueを_追加_できます。
このメソッドは、配列の新しい長さを返します。
const numbers = [1, 'two', 3, 'four'];
numbers.push(5); // => 5
numbers;
// => [1, 'two', 3, 'four', 5]
.pop()を使うと、配列から_最後_のvalueを_削除_できます。
このメソッドは、削除した値を返します。
この変更により、配列の長さは減ります。
const numbers = [1, 'two', 3, 'four'];
numbers.pop(); // => four
numbers;
// => [1, 'two', 3]
.shift()を使うと、配列から_最初_のvalueを_削除_できます。
このメソッドは、削除した値を返します。
この変更により、配列の長さは減ります。
const numbers = [1, 'two', 3, 'four'];
numbers.shift(); // => 1
numbers;
// => ['two', 3, 'four']
.unshift(value)を使うと、配列の先頭にvalueを_追加_できます。
このメソッドは、配列の新しい長さを返します。
const numbers = [1, 'two', 3, 'four'];
numbers.unshift('one'); // => 5
numbers;
// => ['one', 1, 'two', 3, 'four']
.splice(index, 1)を使うと、特定のindexにあるvalueを配列から_削除_できます。
このメソッドは、削除された要素を返します。
const numbers = [1, 'two', 3, 'four'];
numbers.splice(2, 1, 'one'); // => [3]
numbers;
// => [1, 'two', 'one', 'four']
これらのメソッドには、ここで説明した以上の機能があります:
pushとunshiftはどちらも、引数を増やすことで、複数の値を一度に追加できます。
ただし、この演習を完了するために必要な機能ではありません。deleteCountのあとに引数を追加することで、複数の値を追加することもできます。
これは、値の置き換えや、配列の途中への値の挿入(たとえば0個の要素を削除する)に使えます。
ただし、この演習を完了するために必要な機能ではありません。マジシャンの卵であるElyseは、基本をいくつか練習する必要があります。Elyseには、思い通りに動かしたいカードの山があります。
少しでも簡単にするため、Elyseは1から10のカードしか使いません。そのため、カードの山は数値の配列で表すことができます。カードの位置は、配列のインデックスに対応します。つまり、位置0は最初のカード、位置1は2枚目のカードを指す、といった具合です。
2つの関数を除くすべての関数は、カードの配列を更新してから、変更後の配列を返す必要があります。これは、関数をきれいにつなげられるようにする、Builderパターンとして知られる一般的なやり方です。
例外は2つあります。getItemは、指定された位置にあるカードを返す必要があります。checkSizeOfStackは、指定されたサイズが一致する場合にtrueを返す必要があります。
カードを1枚選ぶには、指定された山のインデックスpositionにあるカードを返します。
const position = 2;
getItem([1, 2, 4, 1], position);
// => 4
ちょっとした手品で、インデックスpositionにあるカードを、渡された交換用のカードと入れ替えます。
調整後の山を返します。
const position = 2;
const replacementCard = 6;
setItem([1, 2, 4, 1], position, replacementCard);
// => [1, 2, 6, 1]
山の一番上に新しいカードを挿して、カードを出現させます。 調整後の山を返します。
const newCard = 8;
insertItemAtTop([5, 9, 7, 1], newCard);
// => [5, 9, 7, 1, 8]
指定されたpositionにあるカードを山から取り除いて、カードを消します。
調整後の山を返します。
const position = 2;
removeItem([3, 2, 6, 4, 8], position);
// => [3, 2, 4, 8]
山の一番上にあるカードを取り除いて、カードを消します。 調整後の山を返します。
removeItemFromTop([3, 2, 6, 4, 8]);
// => [3, 2, 6, 4]
山の一番下に新しいカードを挿して、カードを出現させます。 調整後の山を返します。
const newCard = 8;
insertItemAtBottom([5, 9, 7, 1], newCard);
// => [8, 5, 9, 7, 1]
山の一番下にあるカードを取り除いて、カードを消します。 調整後の山を返します。
removeItemAtBottom([8, 5, 9, 7, 1]);
// => [5, 9, 7, 1]
山のサイズがstackSizeと等しいかどうかを確認します。
const stackSize = 4;
checkSizeOfStack([3, 2, 6, 4, 8], stackSize);
// => false
Exercismに登録すれば、37個のコンセプト159個の演習、そして本物の人間によるメンタリングとともに、JavaScriptを学んでマスターできます。すべて無料です。