5

以下のコードを検討してください。

function splicer()
{
 var arrayElements = ["elem1","elem2","elem3","elem4"];
 for(var index in arrayElements)
 {
  arrayElements.splice(index,1);
 }
 alert("Elements: "+arrayElements);
}

上記の関数は、配列からすべての要素を削除することになってい"arrayElements"ます。しかし、そうはなりません。

Javascript エンジンは をそのまま維持し、"index"変更された配列を気にしません。"for each"人々は、この種の問題がないループのようなものを期待するかもしれません

次のコードでさえ動作しないようです:

function splicer()
{
...
 for(var index in arrayElements)
 {
  arrayElements.splice(index--,1);
 }
...
}

変数「インデックス」の値を変更しても機能しないようです。変更された値は「for(...){...}」ブロック内で使用できますが、ループが次の反復に到達すると、値はリセットされ、次のインデックスから時計仕掛けとして続行されます。

したがって、次のようなコードが唯一の解決策であると思われます。

function splicer()
{
 var arrayElements = ["elem1","elem2","elem3","elem4"];
 for(var index=0;index<arrayElements.length;index++)
 {
  arrayElements.splice(index--,1);
 }
 alert("Elements: "+arrayElements);
}

テスト済み: Firefox 16 ベータ版。

しかし、単項演算子を"splice()"メソッド内に配置すると、一見すると誤解を招くように見えます。

"W3C"これは、彼らが良い解決策を思いつくように、関係者に検討する価値があるかもしれません.

4

2 に答える 2

2

JohnResigarray.remove() リンクを参照することをお勧めします。

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};
于 2012-09-28T08:36:49.167 に答える
0

これを試して:

*スプライスは元の配列を変更するため、tgeループは代替値をスキップします。*

var arrayElements = ["elem1","elem2","elem3","elem4"];
arrayElements.splice(0,arrayElements.length);
alert("Elements: "+arrayElements)
于 2012-09-28T08:38:16.993 に答える