配列の要素を実行するか、そこからいくつかの要素を選択するか、新しい配列を非常に頻繁に形成する必要があります。 これは古典的な方法で行うことができます:
var arr = [1,2,3,4,5,6,7]
var map = [];
var subarray = [];
for(var i = 0、len = arr.length; i <len; i ++){
var item = arr [i];
//何かをする
アラート(アイテム);
//マップとサブ
if(/ *何らかの条件* /){
map.push(アイテム+1);
subarray.push(アイテム)
}
}
ただし、ECMA-262 [1]およびほとんどのフレームワークは、これを達成するための代替(よりエレガントな)方法をサポートしています。
var arr = [1,2,3,4,5,6,7]
arr.forEach(関数((要素、インデックス、配列){アラート(要素);})
var map = arr.map(function((element、index、array){
if(/ *何らかの条件* /)
戻り要素。
})
var subarray = arr.filter(function((element、index、array){return / * some condition * /})
配列メソッドを呼び出して、パラメーター(要素/ *配列要素* /、インデックス/ *この要素のインデックス* /、配列/ *配列自体* /)を持つ各配列要素に対して呼び出される関数(クロージャ、クロージャ、ラムダ)を渡します。 マップおよびフィルター関数の場合、関数が返すもの(マップの場合)または関数がtrueを返す要素(フィルターの場合)で満たされる新しい配列が作成されます。
これらの関数の2番目のパラメーターはthisObjectオブジェクトに渡すことができます。このオブジェクトは、実行中に関数の内部に隠されます)[
1 ]:
var writer = {
sb:[]、
書き込み:関数(s){
this.sb.push(s);
}、
writeln:関数(s){
this.write(s + "\ n");
}、
toString:function(){
return this.sb.join( "");
}
};
[2、5、9] .forEach(writer.writeln、writer);
print(writer.toString()); //印刷がすでに定義されていると仮定します
ブラウザがこれらの機能をサポートしていない場合は、自分で定義できます[
2 ]。
if(!Array.prototype.forEach)
{
Array.prototype.forEach = function(fun / *、thisp * /)
{
var len = this.length;
if(typeof fun!= "関数")
新しいTypeErrorをスロー();
var thisp = arguments [1];
for(var i = 0; i <len; i ++)
{
if(この中のi)
fun.call(thisp、this [i]、i、this);
}
};
}
if(!Array.prototype.filter)
{
Array.prototype.filter = function(fun / *、thisp * /)
{
var len = this.length;
if(typeof fun!= "関数")
新しいTypeErrorをスロー();
var res = new Array();
var thisp = arguments [1];
for(var i = 0; i <len; i ++)
{
if(この中のi)
{
var val = this [i]; // funがこれを変更する場合
if(fun.call(thisp、val、i、this))
res.push(val);
}
}
解像度を返す;
};
}
if(!Array.prototype.map)
{
Array.prototype.map = function(fun / *、thisp * /)
{
var len = this.length;
if(typeof fun!= "関数")
新しいTypeErrorをスロー();
var res = new Array(len);
var thisp = arguments [1];
for(var i = 0; i <len; i ++)
{
if(この中のi)
res [i] = fun.call(thisp、this [i]、i、this);
}
解像度を返す;
};
}
フレームワークの中で、これらの機能の最も文学的サポートはdojoで行われます。 関数名が仕様に一致し、サポートされていない場合は再定義されます。 残り(Ext、jquery、prototype)では、これらの関数は異なる名前と異なるバリエーションでサポートされています。