jsは配列のいくつかの方法を削除します。

3296 ワード

var arr=''a'、'b'、'c';
その中の'b'を削除するには、2つの方法があります。
1.delete方法:delete arr[1]
このような配列の長さは不変で、この時arr[1]はundefinedになりましたが、元の配列のインデックスも変わらないという利点があります。この時は配列要素を遍歴してから使うことができます。

for(index in arr)
{
 document.write('arr['+index+']='+arr[index]);
}
このエルゴード方式はundefinedの要素をスキップします。
*この方式はIE 4.o以降サポートされました。
2.配列オブジェクトのsplice方法:arr.splice(1,1);
このような配列長は対応して変化しますが、元の配列インデックスも対応して変化します。
spliceパラメータの最初の1は、削除の開始インデックス(0から計算します)です。ここでは配列の2番目の要素です。
第二の1は、要素の個数を削除します。ここでは一つの要素、すなわち'b'だけを削除します。
この時、配列要素を巡回します。これは、削除された要素が配列に保存されていないため、通常の遍歴配列として使用できます。
*この方法はIE 5.5以降にサポートされます。
特に、splice方法は配列要素を削除すると同時に、配列要素を追加することができます。
例えば、arr.splice(1,1,d'、'e')、d,eの2つの要素が配列arrに参加されます。
結果配列はarr:'a','d','e','c'になります。
JavaScriptは配列のlength属性を設定することによって配列を切断する唯一の方法であり、Delete演算子を使用して配列の要素を削除すると、その要素は未定義になりますが、配列のlength属性は2つの削除要素を変更せず、配列長も変更する方法です。

  /*
  *   :Array.remove(dx)
  *   :      .
  *   :dx       .
  *   :         
  */

 //         ,    .

Array.prototype.remove=function(dx)
 {
  if(isNaN(dx)||dx>this.length){return false;}
  for(var i=0,n=0;i<this.length;i++)
  {
    if(this[i]!=this[dx])
    {
      this[n++]=this[i]
    }
  }
  this.length-=1
 }
 a = ['1','2','3','4','5'];
 alert("elements: "+a+"nLength: "+a.length);
 a.remove(0); //     0   
 alert("elements: "+a+"nLength: "+a.length);

/*
  *   :Array.baoremove(dx)
  *   :      .
  *   :dx       .
  *   :         .
  */
  
 //      splice   .
  
 Array.prototype.baoremove = function(dx)
 {
  if(isNaN(dx)||dx>this.length){return false;}
  this.splice(dx,1);
 }
 b = ['1','2','3','4','5'];
 alert("elements: "+b+"nLength: "+b.length);
 b.baoremove(1); //     1   
 alert("elements: "+b+"nLength: "+b.length);
私たちは、IE 5以下のバージョンでは、JavaScriptのArayオブジェクトは、既存の配列要素を削除する方法を提供していないことを知っています。IE 5.5+のバージョンでは、splice方法がありますが、ある項目(またはいくつかの項目)を削除するのではなく、ある項目(またはいくつかの項目)の値をクリアするだけで、つまり、この項目は依然として存在しています。配列の長さは変わりません。
実際には、私達は自分で配列のために削除方法を追加することができます。行列のために循環して再割り当てをしたいと思うかもしれませんが、効率は低いです。
次に、Arayオブジェクトを利用した二つの方法を紹介します。slice、concatは、削除配列を定義する方法から来ます。
具体的なコードは以下の通りです。中のコメントに注意してください。

Array.prototype.del=function(n) { //n     , 0    。
//prototype     ,                 。
 if(n<0) //  n<0,        。
  return this;
 else
  return this.slice(0,n).concat(this.slice(n+1,this.length));
  /*
   concat  :       ,                   。
               this.slice(0,n)/this.slice(n+1,this.length)
               ,   ,     n 。
   slice  :          ,    ,            。
  */
}
//               
var test=new Array(0,1,2,3,4,5);
test=test.del(3); // 0  ,        4 。
alert(test);
このように、Arayオブジェクトの二つの方法を活用するだけで、私たちの要求が実現されます。