Core JavaScript 1.5 Reference:Global Objects:Array:map
出典: MDC
目次 |
[編集] 概要
与えられた関数を配列のすべての要素に対して呼び出し、その結果からなる新しい配列を生成します。
| Array のメソッド | |
| 実装されたバージョン: | JavaScript 1.6 (Gecko 1.8b2 以降) |
| ECMAScript バージョン: | なし |
[編集] 構文
var mappedArray = array.map(callback[, thisObject]);
[編集] パラメータ
-
callback - 現在の配列の要素から新しい配列の要素を生み出すための関数。
-
thisObject -
callbackを実行するときにthisとして使用するオブジェクト。
[編集] 説明
map は、与えられた callback 関数を配列の各要素に対して順番に一度ずつ呼び出し、その結果から新しい配列を生成します。callback は値が代入されている配列のインデックスに対してのみ呼び出されます。つまり、すでに削除されたインデックスや、まだ値が代入されていないインデックスに対しては呼び出されません。
callback は、要素の値、要素のインデックス、走査されている Array オブジェクトという 3 つの引数をともなって呼び出されます。
map に thisObject パラメータが与えられると、callback の呼び出しのたびにそのオブジェクトが this として使用されます。thisObject が与えられないか null だと、callback に結び付けられたグローバルオブジェクトが代わりに使用されます。
map は呼び出された配列を変化させません。
map によって処理される要素の範囲は、callback が最初に呼び出される前に設定されます。map の呼び出しが開始された後に追加された要素に対しては、callback は実行されません。既存の配列要素が変更されたり、削除された場合、callback に渡される値は map がそれらを訪れた時点での値になり、削除された要素には訪問されません。
[編集] 互換性
map は ECMA-262 標準に対する JavaScript 拡張なので、ECMA-262 標準の他の実装では存在しない場合があります。次のコードをスクリプトの先頭に挿入すると、map がネイティブでサポートされていない ECMA-262 実装でも map を使用できるようになります。これは Firefox および SpiderMonkey で使われているアルゴリズムとまったく同じものです。
if (!Array.prototype.map)
{
Array.prototype.map = function(fun /*, thisp*/)
{
var len = this.length;
if (typeof fun != "function")
throw new TypeError();
var res = new Array(len);
var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
if (i in this)
res[i] = fun.call(thisp, this[i], i, this);
}
return res;
};
}
[編集] 例
[編集] 例: 配列内の単語 (文字列) を複数形にする
次のコードは、名詞の単数形からなる配列を元にして、それらの名詞の「複数形」からなる配列を生成します。
function makePseudoPlural(single)
{
return single.replace(/o/g, "e");
}
var singles = ["foot", "goose", "moose"];
var plurals = singles.map(makePseudoPlural);
// plurals は ["feet", "geese", "meese"]
// singles は変化しない
[編集] 例: 数値の配列を平方根の配列にマッピングする
次のコードは、数値からなる配列を取り、それらの数値の平方根からなる新しい配列を生成します。
var numbers = [1, 4, 9]; var roots = numbers.map(Math.sqrt); // roots は [1, 2, 3] となる // numbers は [1, 4, 9] のまま
[編集] 例: 汎用的な map の使用
以下の例は、各文字を表す ASCII エンコードのバイトの配列を得るために 文字列 に map を使う方法を示しています。:
var a = Array.prototype.map.call("Hello World",
function(x) { return x.charCodeAt(0); })
// 今 a は [72,101,108,108,111,32,87,111,114,108,100] に等しい