JavaScriptでの配列トラバーサル

配列の要素を実行するか、そこからいくつかの要素を選択するか、新しい配列を非常に頻繁に形成する必要があります。 これは古典的な方法で行うことができます:



 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)では、これらの関数は異なる名前と異なるバリエーションでサポートされています。



All Articles