あまりつかえない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
参考
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:indexOf
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:lastIndexOf
追記(手直し) 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だと使えた。)。