Hatena::Groupos0x

FFFF RSSフィード

0xFFのメモです。

2010 July 31st Saturday

密な配列を作る小ネタ

| 00:20 | 密な配列を作る小ネタ - FFFF を含むブックマーク はてなブックマーク - 密な配列を作る小ネタ - FFFF

また脱線メモ。

new Array(10)した配列をforEachしてもスルーされちゃう問題について、IE以外はArray.apply(null, Array(10))とすれば良い via TOYAMA Naoさんのツイート: "そういえば以前、要素数nの密な配列を作るのに Array.apply(null, Array(n)) が使えないかと思ったけど、JScriptでダメだったんだよね。" この方法はIE9pp3でも動いた。

で、ふと別の方法を思いついて試したところIE6でも動いた。こんな感じ。

var a=new Array(10);
a.splice.apply(a, Array(a.length+2));
var r = [];
for (var i in a){
  r.push(i);
}
alert(r);// 0,1,2,3,4,5,6,7,8,9

a.splice.apply(a, Array(a.length+2)); を1行追加するだけ。全然面倒!わかり難い!

まあ、Array(n).join().split(',')よりはマシのような気もしないこともないけど、こういうのが欲しいのは大抵書き捨てのコードなので、やっぱりjoin splitで十分だよね。

2009 June 2nd Tuesday

parseIntRight

| 11:24 | parseIntRight - FFFF を含むブックマーク はてなブックマーク - parseIntRight - FFFF

id=”id-1234”からIDを抜き出すjQueryプラグイン

getIdだとId自身を取得すると思ってしまう。やってることはparseIntを逆から処理する感じなので、reduce/reduceRightに倣って、parseIntRightってメソッドを定義するのが良いのではないか。

http://gist.github.com/121940

ただ、parseIntRightなら aaa0xFF な文字列にも対応したいところだけど、その辺は妥協…

2009 June 1st Monday

破壊的な配列走査

| 20:48 | 破壊的な配列走査 - FFFF を含むブックマーク はてなブックマーク - 破壊的な配列走査 - FFFF

配列の各要素を書き換えたい場合、Array#mapを使うのが一般的だと思う。

var array = new Array(500).join(',').split(',');
array = array.map(function(a,i,ar){
	return i;
});

map自体は破壊的ではないので、代入し直さないといけないのが煩わしい。

それならこう書くのもありではないか。

array.forEach(function(a,i,ar){
	ar[i] = i;
});

うん、こっちのほうが速そう。(滅多に使われない)第3引数の配列自身を使えばなかなか汎用的。

というわけで、軽くベンチ。

no title

んー、微妙にmapよりは速いけど、体感的な差が出ることはなさそうな誤差レベルな感じ。

というわけで、好みの問題かな。

2008 June 21st Saturday

ObjectからObject?への分割代入

| 19:53 | ObjectからObject?への分割代入 - FFFF を含むブックマーク はてなブックマーク - ObjectからObject?への分割代入 - FFFF

(改めて書くのもあれだけど、分割代入が使えるのは2008年6月現在でFirefoxとOperaだけです)

mal_blue@tumblrより。

var {0:a, 3:b} = [10,20,30,40,50];
alert(a);// 10
alert(b);// 30

これは配列からObject?への代入ですが、ObjectからObject?への代入もできます。

var {a:a, b:b} = {a:10,b:20,c:30,d:40,e:50};
alert(a);// 10
alert(b);// 20

もうちょっと実用的に、こんな書き方ができます。

document.addEventListener('click',function(evt){
    var {pageX:x,pageY:y} = evt;
    console.log(x,y);
},false);

感覚的にはvar {x:pageX}と書きたくなってしまうので、ミスしやすそうなのが気になるところ。

そして、この場合左側はObjectっていってよいのかな?


ちなみに、Operaも分割代入をサポートしてるといわれているけど、Objectには入れられないし、var宣言をつけただけでも構文エラーだから使い物に。。

mal_blueさんにコメントで補足いただきました。ありがとうございます。

mal_bluemal_blue2008/06/22 14:40・http://wiki.ecmascript.org/doku.php?id=proposals:destructuring_assignment
が元になってますから、左辺は Object Patten, Array Pattern といえばいいんじゃないですかねぇ。

・js1.8(fx3) だと evt の例は

var {pageX, pageY} = evt;

と書けます。
https://bugzilla.mozilla.org/show_bug.cgi?id=404734
web 上で、1.8を使う気になるかなぁ…

mal_bluemal_blue2008/06/22 14:50書き忘れた。
元の話は Array を Object Pattern に分割代入できるのがアレだ、という話ですんで、当然といえば当然なんですが。
逆(Array Pattern に Object を分割代入) も一応できるみたいですね。

var [a,b] = {0:11,1:22}; alert(a); alert(b) // 11,22

使いどころが思いつきませんが…

os0xos0x2008/06/23 13:00補足ありがとうございます! 勉強になります。

matsukazmatsukaz2008/06/25 01:55こんな宣言の仕方が出来るんですね!
目からウロコです(@@
勉強になりました!

2008 May 15th Thursday

0で詰めるJavaScriptのベンチマーク

| 12:24 | 0で詰めるJavaScriptのベンチマーク - FFFF を含むブックマーク はてなブックマーク - 0で詰めるJavaScriptのベンチマーク - FFFF

先頭を0で埋めて桁をそろえる(解説付き) - 素人がプログラミングを勉強していたブログ "先頭を0で埋めて桁をそろえる" を考えてみた - Higé au laitに便乗。

というか、以前書いたものがあるので、ベンチ取ってみた。

http://ss-o.net/jsenumerator/benchmark/fill0.html

// http://d.hatena.ne.jp/javascripter/20080514/1210791575
Number.prototype.fillZeroBy_javascripter=function(n){
    return (new Array(n).join('0')+this).substr(-n);
};

// http://d.hatena.ne.jp/higeorange/20080515/1210817629
/*Number.prototype.fillZeroBy_higeorange = function(n) {
    var r = this.toString().split('');
    while(r.length <= n) {
        r.unshift('0');
    }
    return r.join('');
}*/
Number.prototype.fillZeroBy_higeorange = function(n) {
    return Array((n+1) - this.toString().split('').length).join('0') + this;
}

// http://os0x.g.hatena.ne.jp/os0x/20080131/1201801302
Number.prototype.fillZeroBy_os0x = function(len) {
    return ('' + Math.pow(10,len) + this).slice(-len);
}
function format0(str,len){
    return ('_' + Math.pow(10,len) + str).slice(-len);
}
// nanto_vi
Number.prototype.fillZeroBy_nanto_vi = function(len) {
    return ((1 << len).toString(2) + this).slice(-len);
}

// http://d.hatena.ne.jp/murky-satyr/20080516/1210877657
Number.prototype.fillZeroBy_murky_satyr = function(n){
    return (0 .toFixed(n) + this).slice(-n);
}
Number.prototype.fillZeroBy_murky_satyr_golf = function(l){return (''+1e20+this).slice(-l);}

例によって、JSEnumeratorのBenchmarkツールを使わせていただいています。

自作のはprototype使ってない、数値演算ベースなのが良いのか結構高速みたい(文字列でもokだし)。ただし、0の数が大きくなる(20桁?)と指数表示になっちゃてうまくいかない。そんな大量に0詰めすることは滅多にないだろうけど。

Number.prototype.fillZero - ellaneousを追加、コメント欄のnanto_viさんのも追加してみた。