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 も受け付ける感じにしてるけど、これでいいのか分からん。
まぁ使えるっちゃ使える。
*/