概要
配列のメソッドについて試してみます。
メソッドはprototypeオブジェクトのメソッドとしてjavascriptの標準機能として実装されています。
近年ではECMAScriptのバージョンも上がってきており、最新の言語仕様に対応する必要性があります。
現在普及している言語標準化規格は「ECMAScript2015」(ES6)と「ECMAScript2016」(ES7)が大半になりますが、言語仕様が新しくなる前から実装されている基本的なメソッドについても試してみます。
join
配列の全ての要素を文字列に変換して連結するメソッドです。
実際に次のようコードを書いて動かしてみます。
let test1 = [1, 10, 20, 30, 60];
console.log(test1.join());
出力結果は次のようになります。
1,10,20,30,60
少しわかりづらいですが、出力結果はひとつづきの文字列になっています(カンマも含む)
sort
配列の全ての要素をソートするメソッドです。
実際に次のようコードを書いて動かしてみます。
let test2 = [10, 30, 1, 20, 60];
console.log(test2.sort());
出力結果は次のようになります。
Array(5) [ 1, 10, 20, 30, 60 ]
配列内の各要素を数値として比較し、小さい→大きい順にソートされています。
では、配列内の要素が数値と文字列があった場合に、どのような挙動になるか試してみます。
具体的に次のコードを書いて動作させてみます。
let test3 = ["xyz", 30, "abc", "5", 60];
console.log(test3.sort());
出力結果は次のようになります。
Array(5) [ 30, "5", 60, "abc", "xyz" ]
上記の出力結果はとても「ソートした結果」とは言えず、不完全なものです。
言語仕様にもよりますが、文字列と数値が混在した配列は、sort関数ではソート不能という結果になりました。
では、配列内の要素が全て数値である(負の数、0、正の数)場合のソート結果はどうなるでしょうか。
次のようなコードを書いて実行してみます。
let test4 = [-50, 30, -100, 0, 5, 60];
console.log(test4.sort());
出力結果は次のようになります。
Array(6) [ -100, -50, 0, 30, 5, 60 ]
これも、よく見るとソートが不完全です。
結果の後半で「30, 5, 60」のように、桁が考慮されておらず、単純に文字列の出現順(アルファベット順)として出力されています。
上記の配列test4を厳密に数値してソートするには、次のように書きます。
let test4 = [-50, 30, -100, 0, 5, 60];
//数値順としてソートする場合
console.log(test4.sort(function(a, b) { let ans = b - a; if(isNaN(ans)) { return -1; } else { return a - b; }}));
このように書くと、次のような出力結果になります。
Array(6) [ -100, -50, 0, 5, 30, 60 ]
これで正しくソートされています。
sort関数内で、無名関数を定義し、その無名関数の中で引数同士を比較して、比較結果により、引数をソートする判定を行っています。
より詳しく書くと、2つの引数「a」と「b」を比較し、
「b – a」の演算結果が
「正」になる場合は、aをbの後ろへ
「負」になる場合は、aをbの前へ
という無名関数を作り、その演算を繰り返すことで、正しいソート結果を得ています。
concat
concatメソッドは、配列に対して、要素を追加して新しい配列要素を返します。
具体的には次のように書きます。
let test5 = ["xyz", 30, "abc", "5", 60];
console.log(test5.concat(10, 20));
出力結果は
Array(7) [ "xyz", 30, "abc", "5", 60, 10, 20 ]
のようになります。
contactの引数「10, 20」の要素を、元の配列「test5」の最後に付け加えています。
slice
sliceメソッドは配列に対して、指定番目の要素をスライスして別な配列を返します。
引数が2つあり、1つ目の引数で、スライス開始の要素(○番目)を指定し、2つ目の配列で配列の末尾を指定します。
引数が1つのみの場合は、その引数で指定した要素から配列の最後までを取得します。
引数が負の数の場合は、配列の最後から数えた要素数からスライスされます。
次のようなコードを書いて試してみます。
let test6 = ["xyz", 30, "abc", "5", 60];
console.log(test6.slice(0, 2));
console.log(test6.slice(4));
console.log(test6.slice(-2));
出力結果は次のようになります。
Array [ "xyz", 30 ]
Array [ 60 ]
Array [ "5", 60 ]
splice
配列に要素を挿入したり、削除する場合に使います。
このメソッドの特徴として、メソッドを実行する配列に対し、直接要素を操作する点があります。
例えば、次のようなコードを書いて実行してみます。
let test7 = ["xyz", 30, "abc", "5", 60, 70, "80", 90];
console.log(test7.splice(3)); //出力結果 ["5", 60, 70, "80", 90]
//一旦、元の配列の要素を出力して確かめる
console.log(test7); //出力結果 ["xyz", 30, "abc"]
//さらにspliceメソッドを使う
console.log(test7.splice(1, 2)); //出力結果 [30, "abc"]
//元の配列の要素を出力して確かめる
console.log(test7); //出力結果 ["xyz"]
実行した際の2つめの出力を確認すると、spliceメソッドを使った後の配列は、要素が先頭の3つのみになっています。
つまり元の配列の要素数が変更され、要素が減っている状態と言えます。
さらに2回目のspliceの実行で、要素は元の配列の1番目から2つ削除されます。
最終的には元の配列の要素は1つだけになり、「”xyz”」の文字列が出力されました。
push pop
pushメソッドは配列に対して、最後に1つの要素を追加するメソッドです。
その反対にpopメソッドは、配列の最後の要素を削除します。
配列の長さは動的に変化し、pushした場合は1つ増加し、popした場合は1つ減少します。
この2つのメソッドを使うと、配列に対してのスタック操作が可能になります。
上記を踏まえて次のようなコードを試してみます。
let test8 = [];
test8.push(3)
console.log(test8);
test8.pop();
console.log(test8);
test8.push(5, 2);
console.log(test8);
test8.pop();
console.log(test8);
test8.push(4);
console.log(test8);
test8.push(6);
console.log(test8);
出力結果は次のようになります。
Array [ 3 ]
Array []
Array [ 5, 2 ]
Array [ 5 ]
Array [ 5, 4 ]
Array(3) [ 5, 4, 6 ]
pushとpopのメソッドを実行した後、それぞれ配列の最後の値が増加、減少していることがわかります。
unshift shift
unshiftメソッドとshiftメソッドは、配列の先頭の要素を操作します。
unshiftは配列の先頭に要素を追加します。
shiftは配列の先頭の要素を削除します。
先ほどpushで書いたコードに似た次のようなコードを書いて試してみます。
let test9 = [];
test9.unshift(3)
console.log(test9);
test9.shift();
console.log(test9);
test9.unshift(5, 2);
console.log(test9);
test9.shift();
console.log(test9);
test9.unshift(4);
console.log(test9);
test9.unshift(6);
console.log(test9);
出力結果は次のようになります。
Array [ 3 ]
Array []
Array [ 5, 2 ]
Array [ 2 ]
Array [ 4, 2 ]
Array(3) [ 6, 4, 2 ]
pushやpopと違い、配列の先頭に要素を追加していることがわかります。
toString
配列に対してのtoStringメソッドを試してみます。
このメソッドは配列要素の一つ一つを文字列に変換してカンマ区切りのリストを出力します。
実際に次のようなコードを書いて試してみます。
let test10 = ["xyz", 30, "abc", "5", 60, 70, "80", 90];
console.log(test10.toString());
出力結果は次のようになります。
xyz,30,abc,5,60,70,80,90
配列要素が全てカンマ区切りで連結され、全体でひとつの文字列として出力されています。
また、類似するメソッドとして、toLocaleStringメソッドがあります。
メソッドの動きはtoStringと同様の動きになりますが、区切り文字がロケール固有区切り文字で区切られます。
区切り文字はプログラム実行時の、ブラウザ環境に依存します。