Array.insert()
ぶっこわれた
by ethertank
JavaScript
Array.prototype.insert || (Array.prototype.insert = function(idx) {
if (typeof idx !== 'number') throw TypeError('"Array.insert" method\'s first argument must be a integer number.');
if (arguments.length < 2 || idx >= this.length) return this;
var argIdx = (idx < 0) ? Math.abs(idx) + 1 : idx,
len = arguments.length,
a = this.slice(),
r = a.slice(0, argIdx),
i = 1;
a.slice(0, argIdx);
for (; i < len; ++i) r.push(arguments[i]);
return r.concat(a.slice(argIdx, a.length));
});
/* syntax *//*
[Array].insert(index,value[, value, value...]);
*/
// 配列の指定位置(index)の直前(負の値の場合はindexの直後)にvalueを挿入した配列を返す。
// check
var a = [1, 2, 5];
var b = a.insert(2, 3, 4);
var br = "<br />";
document.write(
"b : " + b + br +
typeof b + " / " + (b instanceof Array) + " / " + b.length + br +
"a : " + a + "(非破壊チェック)"
);
// error check
try {
[1,3].insert("最初らへん",2);
} catch(e){
document.write(br + br + e);
}
/*
Rubyとかいう言語にはこういうのがあるらしい。参考 : http://doc.ruby-lang.org/ja/1.9.2/class/Array.html
挿入先の配列数以上のindexが指定された場合は何もしないで元の配列を返すようにしたけど、
Rubyのやつの動作がどんなか知らん。破壊的メソッドなのかどうかも分からん。
今度お腹空いてないときに調べる。
複数要素の挿入に対応してなかったので直したつもりが、ぶっ壊れた。悲しい。
つーか、a はどうなってるべきなのか。今度お腹空いてないときに直す。
直った。非破壊メソッドにした。まだ何も調べてない。エラーメッセージが変。
第二引数以降に null も受け付ける感じにしてるけど、これでいいのか分からん。
まぁ使えるっちゃ使える。
*/