2012-04-18 1 views
0

ここにJavaScriptがあります。この癖を考慮し、(これを共有するためのM. Staveleyのおかげで)this awesome postからリッピング:値が削除されたときに配列がアンセットされない - または配列の数を取得する最善の方法?

var colours = ['red', 'green', 'blue'] 
// is red really in the array? 
console.log(colours.indexOf('red') > -1); // outputs true. 
// remove red, it's going out of fashion! 
delete colours[colours.indexOf('red')]; 
console.log(colours.indexOf('red') > -1); // outputs false 
console.log(colours.length) // length is still three, remember it's javascript! 

最終行は何のバグを私にあります。この気まぐれは私の好奇心を最大限に引き出し、coloursの実数にアクセスするためのエレガントな方法は何ですか?

答えて

2

しばらくので、あなたは、実際にJavascriptの配列の誤用だそのspliceまたはshift

colours.shift(); 
console.log(colours.length); 

または

colours.splice(colours.indexOf('red'), 1); 
console.log(colours.length); 
2

のように、native array functionsのいずれかを使用する必要がありdelete

を使用しないでください回避策があります(for...inを使用し、名前が数字であるプロパティの数を数えます)。y確かにそれをエレガントなものと呼んでいないでしょう(see it in action)。

deleteを使用せず、手動でインデックスを要素に割り当てないでください(var colors = []; colors[1000] = 'red';)。配列がどのように使用されるのかということではありません。

2

deleteは、要素の参照のみを削除します。配列のロジックは更新されません。そのような壊れた配列に変数の実際の数を得るためのエレガントな方法はありません(Jon's suggestion参照)。したがって、shift,pop,spliceまたはvar newarray = oldarray.sliceを使用してください。

も参照してください:

1

deleteはちょうどundefinedに値を設定し、それが配列から削除されません。

delete colours[colours.indexOf('red')]; 

あなたの配列は次のようになります。あなたが見ることができる、のよう

[undefined, 'green', 'blue'] 

、長さは、配列から値を削除するには、まだ3である、あなたはspliceを使用することができます。

colours.splice(colours.indexOf('red'), 1); 
1

アレイ内の項目を削除するためにdeleteを用いるが、アレイ内の「穴」を残します。それは値を削除するが、それは "スペース"ではないので、配列の長さは変わらない。

splice

array.splice(colours.indexOf('red'),1); //remove 1 item starting from index 
+0

を使用し、その配列内の値だけでなく、スペースを削除するには、これは仕様で定義されている場所を知っていますか? [delete'のセクション](http://es5.github.com/#x8.12.7)を見ると、配列に適用された動作については何も見つかりません。 –

+0

@JamesAllardice [類似の回答](http://stackoverflow.com/a/500617/575527)もこれを言及しています。 deleteはアイテムを 'undefined'にします。まだ値であるので、スペースを保持し、配列の長さを変更しません。やってみて。 – Joseph

+0

これは何が起こるのか知っていますが、どうしてそれが起こるのか尋ねています。この動作は仕様で定義されていますか?その答えはあなたのものと同じ行動を示すだけです。 –

関連する問題