あまりつかえないArrayメソッドを作ってみた2

Array.prototype.exist = function(st) {
    var c = -1;
    for(var i=0;i<this.length;i++) {
        if(this[i] == st) {
            c = i;
            break;
        }
    }
    return c;
}

Array.prototype.uniq = function() {
    var tmp = this.clone();
    var tmp2 = tmp.clone();
    var result = new Array();
    for(var i=0,len=tmp.length;i<len;i++) {
        tmp2.shift();
        if(tmp2.exist(tmp[i])<0)
            result.push(tmp[i]);
    }
    return result;
}

再びclone()メソッドを使う。
exist()は最初に一致した要素のインデックスが帰ってくる。一致する要素が複数ある場合が問題だなぁ。
uniq()の順番が気持ち悪くなる…。

実行例

js> a=[1,2,3,4,5]
1,2,3,4,5
js> a.exist(4)
3
js> a.exist(6)
-1
js> b=[1,1,2,3,3,4,4,5]
1,1,2,3,3,4,4,5
js> b.uniq()
1,2,3,4,5
js> c=[2,1,3,1,2,4,1,5]
2,1,3,1,2,4,1,5
js> c.uniq()
3,2,4,1,5

追記(手直し) 9/8 10:46

Array.prototype.exist = function(st) {
    var c = false;
    for(var i=0;i<this.length;i++) {
        if(this[i] == st) {
            c = true;
            break;
        }
    }
    return c;
}

Array.prototype.uniq = function() {
    var tmp = this.clone();
    var tmp2 = tmp.clone();
    var result = new Array();
    for(var i=0,len=tmp.length;i<len;i++) {
        tmp2.shift();
        if(!tmp2.exist(tmp[i]))
            result.push(tmp[i]);
    }
    return result;
}

exist()をbool値を返すように変更。インデクッスを返すのは,”Array.indexOf/lastIndexOf”ってのが実装されるようですし。(Firefox1.5だと使えた。)。