Array

概要

JavaScript は配列を扱うことができます。配列とは順序を持つ複数のデータの集合であり、JavaScriptのグローバルオブジェクトである Array は、高位の、(C言語等で云うところの)「リスト」の様な、配列のコンストラクタです。

構文

[element0, element1, ..., elementN] //配列リテラル
new Array(element0, element1, ..., elementN)
new Array(arrayLength)

引数

element0, element1, ..., elementN
数値が唯一の引数として Array コンストラクタに指定された場合以外は、配列は引数に指定された値を要素として初期化され、配列の length プロパティは引数の数に設定されます。
arrayLength
Array コンストラクタに渡される唯一の引数(arrayLength)に 0 から4,294,967,295(232-1 ) までの整数値を指定する場合は、その値を要素数とする配列が作成されます。その際に範囲外の値を指定した場合には、例外:RangeErrorがスローされます。

説明

Arrays are list-like objects that come with a several built-in methods to perform traversal and mutation operations. Neither the size of a JavaScript array nor the types of its elements are fixed.  Since an array's size can grow or shrink at any time, JavaScript arrays are not guaranteed to be dense.  In general, these are convenient characteristics, but if these are desirable things to have for your use case, you might consider using WebGL typed arrays.

JavaScriptの配列は連想配列として使うべきではありません。連想配列にはObjectを使うべきです。

配列要素へのアクセス

JavaScript の配列のインデックスは 0 から始まります。配列の最初の要素のインデックスは0。つまり、最後の要素のインデックスは length プロパティの値より 1 小さい値になります。

var arr = ["最初の要素", "2番目の要素"];
console.log(arr[0]);              // ログ : "最初の要素"
console.log(arr[1]);              // ログ : "2番目の要素"
console.log(arr[arr.length - 1]); // ログ : "2番目の要素"

配列における配列要素は、Array オブジェクトのプロパティです, in the way that toString is a property. しかし、次のように配列の最初の要素にアクセスしようとすると、構文エラーがスローされる事に注意してください

console.log(arr.0);

これは JavaScript の配列に限った話ではありません。オブジェクトの、数字から始まるプロパティに対してはドット演算子を用いた参照は出来ません。

var years = [1950, 1960, 1970, 1980, 1990, 2000, 2010];
try {
  console.log(years.0);
}
catch (ex) {
  console.log("ブラケット記法でのアクセス");
  console.log(years[0]);
}

そこで、ブラケット記法を用いる必要があります。"3d" というプロパティへのアクセスを試みる次のコードを見てください。

try {
  renderer.3d.setTexture(model, "character.png");
} catch (ex) {
  console.log("Using bracket notation");
  renderer["3d"].setTexture(model, "character.png");
}

必要は有りませんが、配列要素へのアクセスにも years[2] でなく years["2"] を使う事が出来ます。"2" と "02" が異なるインデックスであると認識する為に、JavaScriptエンジンが内部的にtoStringメソッドでインデックスに対する文字列への型変換を行っているためです。

console.log(years["2"] != years["02"]);

lengthと数値プロパティとの関係

JavaScript の配列の lengthプロパティと数値プロパティは関連しています。 joinsliceindexOf 等の配列のビルトインメソッドは、配列のlengthプロパティの値を考慮します。 また、pushsplice等は、配列の length プロパティも更新します。

var fruits = [];
fruits.push("banana", "apple", "peach");

console.log(fruits.length); // logs 3

有効なインデックスを持つ JavaScript の配列の現在のサイズに収まらない位置に要素を追加すると、配列はそれを収められる位置まで拡張され、length プロパティも更新されます。

fruits[3] = "mango";
console.log(fruits[3]);
console.log(fruits.length); // logs 4

length プロパティを直接設定した時も特殊な動作となります。

fruits.length = 10;
console.log(fruits);        // "undefined" で満たされている
console.log(fruits.length); // 10

これらについては length ページで更に解説します。

matchの結果を利用して配列を作成

正規表現と文字列の一致から配列を作る事が出来ます。この配列にはプロパティと、マッチに関する情報を提供する要素を持ちます。 配列は RegExp.exec、 String.match、そして String.replace の戻り値です。 これらのプロパティと要素を理解するために、以下の例と表を参照して下さい。

// Match one d followed by one or more b's followed by one d
// Remember matched b's and the following d
// Ignore case

var myRe = /d(b+)(d)/i;
var myArray = myRe.exec("cdbBdbsbz");

プロパティとこの一致から返される要素は以下のとおりです。

プロパティ(要素) 説明
input 正規表現にマッチした文字列を反映する読み取り専用プロパティです。 cdbBdbsbz
index

マッチした文字列の0 から始まるインデックスを示す読み取り専用プロパティです。

1
[0] A read-only element that specifies the last matched characters. dbBd
[1], ...[n] Read-only elements that specify the parenthesized substring matches, if included in the regular expression. The number of possible parenthesized substrings is unlimited. [1]: bB
[2]: d

プロパティ

Array インスタンスから継承されているプロパティについては、Array インスタンスのプロパティを参照してください。

prototype
全てのオブジェクトにプロパティを追加することができます。

Function.prototype から継承されるプロパティ
caller, constructor, length, name

メソッド

Array インスタンスから継承されているメソッドについては、Array インスタンスのメソッドを参照してください。

グローバルな Array オブジェクトは、自分自身のメソッドを持っていませんが、プロトタイプチェーンを通していくつかのメソッドを継承しています。

Function.prototype から継承されるメソッド
apply, call, toSource, toString, valueOf

Array インスタンス

Array インスタンスは、Array.prototype を継承します。全てのコンストラクタと同様に、コンストラクタのプロトタイプオブジェクトを変更して、Array インスタンスの全てを変更することができます。

プロパティ

constructor
オブジェクトのプロトタイプを生成する関数を指定します。
index
これは、 Array プロトタイプの疑似プロパティです。なぜなら、デフォルトでは、継承されないからです。実際には、正規表現のマッチによって生成された配列にのみ存在します。このプロパティは、文字列中でマッチした部分のゼロから始まる添え字を表します。
input
このプロパティは、正規表現のマッチによって生成された配列にのみ存在します。正規表現がマッチを行った元の文字列を反映します。
length
配列の要素数を反映します。

メソッド

変異メソッド

これらのメソッドは配列を書き換えます。:

pop
配列から最後の要素を取り除き、その要素を返します。
push
配列の最後に 1 つ以上の要素を追加し、新しい配列の長さを返します。
reverse
配列の要素の順番を逆転させます。最初の要素は最後に、最後の要素は最初になります。
shift
配列から最初の要素を取り除き、その要素を返します。
sort
配列の要素をソートします。
splice
配列から要素を追加したり取り除いたりします。
unshift
配列の最初に 1 つ以上の要素を追加し、新しい配列の長さを返します。

アクセサメソッド

これらのメソッドは配列を書き換えず、配列を何らかの形で表現したものを返します。

concat
元の配列に他の配列や値をつないでできた新しい配列を返します。
join
配列の全ての要素を繋いで文字列にします。
slice
配列の一部を取り出して新しい配列を返します。
toSource 非標準
指定された配列を表す配列リテラルを返します。あなたはこの値を新しい配列を作るのに使うことができます。Object.prototype.toSource メソッドを上書きしています。
toString
配列とその要素を表す文字列を返します。Object.prototype.toString メソッドを上書きしています。
indexOf JavaScript 1.6 が必要
指定された値と等しい値を持つ最初の(添字の一番小さい)要素の添字を返します。もし見つからなかったら -1 を返します。
lastIndexOf JavaScript 1.6 が必要
指定された値と等しい値を持つ最後の (添字の一番大きい)要素の添字を返します。もし見つからなかったら -1 を返します。

反復メソッド

いくつかのメソッドは引数として、配列を処理する際にコールバックされる関数を取ります。これらのメソッドが呼ばれる際、配列の length(長さ)を一時記憶するため、コールバック中にこの長さを超えて追加された要素には訪れません。配列に対するその他の変更(値の書き換えや要素の削除)は、もしメソッドが変更した要素に後で訪れた場合には、操作の結果に影響を及ぼすかもしれません。

そのような場合におけるこれらのメソッドの振る舞いはうまく定義されているわけではないので、コードを読む他者を混乱させないよう、これらのメソッドに頼るべきではありません。配列を変化させなければならない場合、代わりに新しい配列にコピーしてください。

filter JavaScript 1.6 が必要
ある配列の要素で、与えられたフィルタリング関数が true を返したものすべてからなる新しい配列を生成します。
forEach JavaScript 1.6 が必要
配列中のそれぞれの要素について関数を呼び出します。
every JavaScript 1.6 が必要
ある配列の全ての要素が与えられたテスト関数を満たした場合に true を返します。
map JavaScript 1.6 が必要
ある配列の全ての要素について与えられた関数を呼び出した結果からなる新しい配列を生成します。
some JavaScript 1.6 が必要
ある配列の少なくとも 1 つの要素が与えられたテスト関数を満たした場合に true を返します。
reduce JavaScript 1.8 が必要
1 つの値に還元されるように、配列の 2 つの値に対し(左から右へ)同時に関数を適用していきます
reduceRight JavaScript 1.8 が必要
1 つの値に還元されるように、配列の 2 つの値に対し(右から左へ)同時に関数を適用していきます。

汎用メソッド

JavaScript の Array オブジェクト上の多くのメソッドは、配列「のように見える」あらゆるオブジェクトに対し広く適応されるよう設計されています。すなわち、length プロパティを持ち、数字のプロパティ名を使って(array(5) で参照するように)有効にアクセスできるどんなオブジェクトにも、それらを使用することができるのです。

String join のようないくつかのメソッドは、それを呼び出すオブジェクトの length や数字のプロパティを読み取ることだけをします。他の reverse のようなメソッドは、オブジェクトの数字のプロパティや length が変更可能である必要があります。それゆえこれらのメソッドは、length プロパティや合成された数字のプロパティを変更することが許されていない String のようなオブジェクトに対し呼び出すことはできません。

JavaScript 1.6 で導入

例: 配列を生成する

以下の例では、長さ 0 の配列 msgArray を生成し、msgArray[0]msgArray[99] に値を代入することで、配列の長さを 100 に変えています。

var msgArray = new Array();
msgArray[0] = "Hello";
msgArray[99] = "world";

if (msgArray.length == 100)
   print("The length is 100.");

例: 2 次元配列を生成する

以下では、文字列の 2 次元配列としてチェスボードを生成しています。 最初の動きは 1,4 の 'P' を 3,4 にコピーすることでなされます。 位置 1,4 は空白にされます。

var board = 
[ ['R','N','B','Q','K','B','N','R'],
  ['P','P','P','P','P','P','P','P'],
  [' ',' ',' ',' ',' ',' ',' ',' '],
  [' ',' ',' ',' ',' ',' ',' ',' '],
  [' ',' ',' ',' ',' ',' ',' ',' '],
  [' ',' ',' ',' ',' ',' ',' ',' '],
  ['p','p','p','p','p','p','p','p'],
  ['r','n','b','q','k','b','n','r']];
print(board.join('\n') + '\n\n');

// キングの前のポーンを 2 つ前へ移動
board[4][4] = board[6][4];
board[6][4] = ' ';
print(board.join('\n'));

出力を以下に示します:

R,N,B,Q,K,B,N,R
P,P,P,P,P,P,P,P
 , , , , , , , 
 , , , , , , , 
 , , , , , , , 
 , , , , , , , 
p,p,p,p,p,p,p,p
r,n,b,q,k,b,n,r

R,N,B,Q,K,B,N,R
P,P,P,P,P,P,P,P
 , , , , , , , 
 , , , , , , , 
 , , , ,p, , , 
 , , , , , , , 
p,p,p,p, ,p,p,p
r,n,b,q,k,b,n,r

ブラウザ毎の互換性

  • Desktop
  • Mobile

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support (Yes) (Yes) (Yes) (Yes) (Yes)
Feature Android Firefox Mobile (Gecko) IE Phone Opera Mobile Safari Mobile
Basic support (Yes) (Yes) (Yes) (Yes) (Yes)

Tags (0)

タグを編集
  • No tags

Attachments (0)

 

添付ファイル