プログラマ的京都生活

2007年11月29日

[]配列のlengthの振る舞い

面倒くせぇぇぇぇえ。

javascript配列から任意のindexの要素を削除するのに、deleteを使ってみたけど、これだと配列オブジェクトのlength値が変わらねぇ!

var ary = new Array();

ary.push('hoge');
ary.push('fuga');
ary.push('piyo');

function print() {
  for(var key in ary) {
    console.log(key + ' : ' + ary[key]);
  }
}

console.info('削除前 : ' + ary.length);
print(ary);

delete ary[1];
console.info('delete実行後 : ' + ary.length);
print(ary);

ary.pop();
console.info('pop実行後 : ' + ary.length);
print(ary);

実行結果はこんな感じ。

削除前 : 3
0 : hoge
1 : fuga
2 : piyo
delete実行後 : 3
0 : hoge
2 : piyo
pop実行後 : 2
0 : hoge

deleteで消した後、添え字が0,1になってくれないのもつらい。まぁこれは望みすぎかもしれないけど。。


書いているうちに、考えてみれば当然の結果かなという気もしてきた。

popのような配列オブジェクトのメソッドであれば内部のlengthパラメーターの値を変更可能だけど(それでもpop実行後の要素数は1とならずに2となっているところを見ると単に-1しているだけなんだな。。)、deleteのような神の手みたいな機能ではプロパティの削除は行ってもオブジェクト固有の値を書き換えるような処理はしないわな。

ってことは、自分でdelete/removeメソッド作らないといけないわけね。。prototype.jsとかなら最初から組み込まれてるかもしらんけど。


追記(12/1)

ary.splice(1,1)を教えていただきました。

実際これを使うと、期待通りの削除が出来ました!