Firefox1.5でサポートされる新しいArrayのメソッド

について。

http://nanto.asablo.jp/blog/2005/09/04/62939
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Methods

ループ処理を便利にするメソッド


Array#forEach
Array#map
Array#filter
Array#every
Array#some

引数として、callback,thisObjを受け取る。配列の各要素に対してcallback関数を実行する。
callback関数はelement, index, arrayを受け取る。value,key,self。値、添え字、配列自身。

Array#forEach
配列の各要素に対してcallback関数を実行する
Array#map
callback関数の返値の配列を返す
Array#filter
callback関数の実行結果が真になった要素のみ集めた配列を返す
Array#every
callback関数の実行結果が全て真の場合にtrueを返す
Array#some
callback関数の実行結果が一つでも真の場合trueを返す

出現位置を探すメソッド


StringのindexOfと同じ要領。searchElementとfromIndexを受け取る。比較は===で行う。

Array#indexOf
searchElementが一番最初に出てくる添え字を返す。fromIndexで開始位置を変更できる。
Array#lastIndexOf
searchElementが一番最後に出てくる添え字を返す。fromIndexで開始位置を変更できる。

lastIndexOfの挙動が少しややこしくてfromIndexをプラスで指定して左端まで来ると右端で止まる。マイナスで指定する場合は左端で止まる。

他のブラウザで使うためのコード


解説がわかりづらいので、わかる人はコードで読んだほうが早いような気がする。
Firefox1.5をインストールして、挙動が同じになるのを確認してみたけど、callback関数で配列を破壊したときにどうなるのかとか、細かいチェックはしてない。一応、これであってるとは思う。
filterやeveryの条件は0とかnullとかundefinedでなければOK。return 1でも良い。
自分でmapとかeachとか作ってやってたけど、これに合わせてcallback関数の類はvalue,key,selfの順に受け取るような設計にしときたいところ。

Array.prototype.forEach = function(callback,thisObject){
    for(var i=0,len=this.length;i<len;i++)
        callback.call(thisObject,this[i],i,this)
}
Array.prototype.map = function(callback,thisObject){
    for(var i=0,res=[],len=this.length;i<len;i++)
        res[i] = callback.call(thisObject,this[i],i,this);
    return res
}
Array.prototype.filter = function(callback,thisObject){
    for(var i=0,res=[],len=this.length;i<len;i++)
        callback.call(thisObject,this[i],i,this) && res.push(this[i]);
    return res
}
Array.prototype.indexOf = function(searchElement,fromIndex){
    var i = fromIndex<0 ? this.length+fromIndex : fromIndex || 0;
    for(;i<this.length;i++)
        if(searchElement === this[i]) return i;
    return -1
}
Array.prototype.lastIndexOf = function(searchElement,fromIndex){
    var max = this.length-1;
    var i = fromIndex < 0 ?    Math.max(max+1 + fromIndex,0):
        fromIndex > max ? max : max-(fromIndex||0) || max;
    for(;i>=0;i--)
        if(searchElement === this[i]) return i;
    return -1
}
Array.prototype.every = function(callback,thisObject){
    for(var i=0,len=this.length;i<len;i++)
        if(!callback.call(thisObject,this[i],i,this)) return false;
    return true
}
Array.prototype.some = function(callback,thisObject){
    for(var i=0,len=this.length;i<len;i++)
        if(callback.call(thisObject,this[i],i,this)) return true;
    return false
}


ところでさいきん、{}を省略したりむやみに三項演算子を使ったりifの代わりに&&使ったりする病気になった。


WriteBacks

配列に要素を挿入するメソッドっていつになったら実装されるんですか?それともすでにあるんですかね?今のところ、僕はそういうメソッドをしらないので、slice, concatを使ってそれを実現しています。

Posted by at 2005/09/13 (Tue) 06:25:30

1.俺に聞かれても困る
2.すでにある
3.splice

Posted by mala at 2005/09/13 (Tue) 07:06:19
TrackBack ping me at
http://la.ma.la/blog/diary_200509122347.trackback
Post a comment

writeback message: Ready to post a comment.







spam yoke. nanimo ireruna.