JavaScript/Array
- JavaScript > 標準ライブラリ Array
Arrayオブジェクト編集
Arrayオブジェクトは配列を扱うための機能を組み込んだオブジェクトです。 配列を作成する際には
const arr = new Array( 'a', 'b', 'c', 'd' );
等の書式で行いますが、オブジェクト初期化子の一種「配列リテラル」があり次のように記法となります。
const arr = ['a', 'b', 'c', 'd'];
JavaScriptの配列は非常に柔軟であるため、データ型に関して制約がない。 そのため
const arr2 = [1,2,3,'4', true, [3,4,5]];
等の様に、複数のデータ型を同時に入れる事ができる。
プロパティ編集
Array.prototype.length編集
配列の有効な最大インデックス+1 を取得する。
静的プロパティ編集
- Array.length
- 1
- コンストラクタの引数の数
- Array.name
- "Array"
- Array.prototype
- [object]
静的メソッド編集
Array.from()編集
Array-likeまたはIterableなオブジェクトから新しい Array インスタンスを生成します。
Array.isArray()編集
配列であれば true を、配列でなければ false を返します。
Array.of(element0 [ , element1 [ , ... ] ] ] )編集
可変個の引数から、新しい Array インスタンスを生成します。 コンストラクタと似た働きをしますが、コンストラクタに1つの整数を渡すとその数だけ empty が詰まった配列を返すが、Arrray.ofメソッドはその数1つを要素とする配列を返します。
インスタンスメソッド編集
この節は書きかけです。この節を編集してくれる方を心からお待ちしています。
Array.prototype.concat( [ item1 [ , item2 [ , ... ] ] ] )編集
配列の連結を行い新しい Array インスタンスを生成する
Array.prototype.constructor()編集
Array.prototype.copyWithin()編集
Array.prototype.entries()編集
Array.prototype.every()編集
Array.prototype.fill()編集
Array.prototype.filter()編集
Array.prototype.find()編集
Array.prototype.findIndex()編集
Array.prototype.flat()編集
Array.prototype.flatMap()編集
Array.prototype.forEach()編集
Array.prototype.includes()編集
配列の要素に値に含まれているか[1]?
const arr = ['a','b','c','d','e','f','g','h','i','j','k'];
console.log(arr.includes('f')); // true
console.log(arr.includes('m')); // false
Array.prototype.includes() の歴史編集
Array.prototype.includes()は、プロポーザルを経てES2016で採用されました[2]。
Array.prototype.indexOf()編集
Array.prototype.join(separator=",")編集
配列を指定した文字を連結子として連結して文字列として返します。
const d = [ 2007, 11, 21 ];
console.log( d.join("-") ); // 2007-11-21 と表示する。
Array.prototype.keys()編集
Array.prototype.lastIndexOf()編集
Array.prototype.map()編集
Array.prototype.pop()編集
配列末尾から要素を取り除く。 このメソッドは破壊的メソッドなので、再代入の必要はありません。 返り値としては、取り除かれた末尾の要素が返ります。
const arr = ['a','b','c','d','e','f','g','h','i','j','k'];
arr.pop(): // 「k」が返ります
console.log(arr); // 「k」を取り除いたa,b,c,d,e,f,g,h,i,jが返ります
([]).pop(); // 配列の中身が空の場合はnullが返ります
Array.prototype.push( [ item1 [ , item2 [ , ... ] ] ] )編集
配列の末尾に要素を追加して、その配列の長さを返します。このメソッドは破壊的メソッドなので再代入の必要はありません。
const arr = [1,2,3,4,5,6,7,8,9,10];
arr.push(11);
console.log( arr );
Array.prototype.reduce()編集
Array.prototype.reduceRight()編集
Array.prototype.reverse()編集
配列の要素の順番を入れ替える。これは破壊的メソッドであるため。再代入の必要はありません。
const arr = [1,2,3,4,5,6,7,8,9,10];
arr.reverse(); // [10,9,8,7,6,5,4,3,2,1,0] になる。
Array.prototype.shift()編集
配列の最初の要素を取り除く。このメソッドは破壊的メソッドのため再代入の必要はありません。 返り値として取り除いた要素を返します。
const arr = [1,2,3,4,5,6,7,8,9,10];
arr.shift();
console.log( arr );
Array.prototype.slice(start, end)編集
startからend番目の1つ前の配列要素を取得する。 引数に負の数を指定すると、配列の末尾からのインデックスでデータの取得を行える[3]。 endを省略する、あるいは undefined を指定すればstartから配列の末尾までを取得できます。 さらに start も省略する、あるいは 0 を指定すると浅いコピー(shallow copy) を取得できます。
const arr = ['a','b','c','d','e','f','g','h','i','j','k'];
console.log(arr.slice(3, 8)); // d,e,f,g,h が返ります
console.log(arr.slice(-5, -1)); // g,h,i,j が返ります
console.log(arr.slice(3, undefined)); // 配列の4番目から最後までが返ります
console.log(arr.slice(3)); // d,e,f,g,h,i,j,k が返ります
console.log(arr.slice(0)); // a,b,c,d,e,f,g,h,i,j,k が返ります
console.log(arr.slice()); // a,b,c,d,e,f,g,h,i,j,k が返ります
最後の、浅いコピー(shallow copy) を取得する用途で slice() を使うことが多いですが、、
const a = [];
for (let i = 0; i < 999; i++)
a.push(i);
console.time("dhry");
for (let i = 0; i < 999999; i++)
;
console.timeEnd("dhry");
console.time("slice");
for (let i = 0; i < 999999; i++)
v = a.slice(0);
console.timeEnd("slice");
console.time("spred");
for (let i = 0; i < 999999; i++)
v = [...a];
console.timeEnd("spred");
/* dhry: 4.679931640625 ms
* slice: 1456.339111328125 ms
* spred: 1302.201904296875 ms
*/
微差ですがスプレッド構文の方が早く、意図もはっきりします。
Array.prototype.some()編集
Array.prototype.sort(comparefn)編集
配列要素を引数で指定した方法でソート(並べ替え)する。ちなみにこのメソッドは破壊的メソッドです。 並べ替えの方法は、引数の中で規則を定めた関数として与える。
説明だけでは分かりにくい実例を挙げる。 例えばバラバラに並んだ数字を、昇順(ascending order)に並べ替えたいとき等には次の様な関数を作成して引数として指定する。
function ascendingOrder( _n1 , _n2 ){
console.log(`ascendingOrder( ${_n1} , ${_n2} )`);
return _n1 - _n2;
}
const arr = [5,8,7,2,4,3,9,1,6,0];
arr.sort(ascendingOrder); // ここで並べ替えを実行する
console.log(arr); // 0,1,2,3,4,5,6,7,8,9が表示される
作成する関数は、配列要素から2つずつ値を受け取ってそれを比較することにより、正、ゼロ、負、NaNのいずれかの値を返します。
並べ替えの規則を指定する場合、関数は非常に簡潔で短いものが非常に多いので実際には次の様にアロー関数を比較に用いる例が多く見られます。
arr.sort((a, b) => a - b); // ここで並べ替えを実行する
Array.prototype.splice(start, deleteCount [ , item1 [ , item2 [ , ... ] ] ] )編集
このメソッドは、分割(split)と切り取り(slice)の似た機能を兼ね合わせてもたせたメソッドです。 また、このメソッドは破壊的メソッドです。また返り値として取り除いた値を返します。
文のみの説明では分かりにくい所があるので、サンプルコードを提示する。 配列からn番目の要素を取り除きたい場合には次の様なコードを記述する。
const arr = ['a','b','c','d','e','f','g','h','i','j','k'];
const n=3;
arr.splice( n, 1 ); // インデックスが3の「d」を取り除く
console.log( arr ); // 「d」が無いa,b,c,e,f,g,h,i,j,kが返ります
spliceメソッドの第2引数は取り除く範囲の大きさです。そのため例えば第2引数に4を指定すると配列の4番目から8番目の要素が取り除かれる。
第3引数以降を利用すると、配列要素の取り除きではなく置き換えができるようになっている。 つまり、第1、第2引数で配列の入れ替え箇所と範囲を指定した後に、そこに入れ替えたい要素を第3引数以降で指定する。
const arr = ['a','b','c','d','e','f','g','h','i','j','k'];
arr.splice( 3, 4, 'x','y','z' ); // インデックスが3~7の間の、つまりd,e,f,gをx,y,zに置き換える
console.log( arr ); // a,b,c,x,y,z,h,i,j,k が表示される。
Array.prototype.toLocaleString()編集
配列を、使用している環境の言語や文化に合わせた読みやすい形式の文字列に変換して返します。 変換は、配列内部の要素を再帰的に文字列化し連結するので要素のtoLocaleString()での変換結果に留意する必要があります。
Array.prototype.toString()編集
配列を文字列化する。
Array.prototype.unshift( [ item1 [ , item2 [ , ... ] ] ] )編集
配列の先頭にアイテムを追加して、その配列の長さを返します。 このメソッドは破壊的メソッドなので再代入の必要はありません。
const arr = ['a','b','c','d','e','f','g','h','i','j','k'];
arr.unshift('z','y','x'); // 配列の最初にz,x,yを追加
console.log( arr ); // z,y,x,a,b,c,d,e,f,g,h,i,j,k が返ります