のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,491,169人
昨日:no data人
今日:
最近の注目
人気の最安値情報

私的良スレ書庫

不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

元スレ+ JavaScript の質問用スレッド vol.100 +

JavaScript スレッド一覧へ / JavaScript とは? / 携帯版 / dat(gz)で取得 / トップメニュー
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
レスフィルター : (試験中)
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
851 : Name_Not - 2012/06/07(木) 00:13:50.05 ID:Ue5itF0d (+22,+29,-28)
>>850
中味がオブジェクトか否かを見ながら再起
852 : Name_Not - 2012/06/07(木) 00:14:07.62 ID:Ue5itF0d (+21,+28,-2)
まちがえた
再帰
853 : 850 - 2012/06/07(木) 00:19:53.95 ID:WPGDDDD6 (+27,+29,-16)
すいません。わからないのでコード教えて下さい。
再帰しすぎるとよくないという話も聞きましたが。。多分、実際のコードでは階層が
千におよぶと思います。
854 : Name_Not - 2012/06/07(木) 00:30:53.80 ID:Ue5itF0d (-3,-30,-149)
>>853
大雑把に書くとこんな

(function(obj){
  for(var n in obj){
    if( obj[n]がオブジェクト ) arguments.callee(obj[n]);
    else obj[n]を煮るなり焼くなり;
  }
})(走査したいオブジェクト);

オブジェクトが大きすぎて実行速度が現実的でないならば
再帰するときにsetTimeoutとか挟んで非同期実行的な感じにするとか
855 : 850 - 2012/06/07(木) 00:48:52.87 ID:WPGDDDD6 (-6,+27,-10)
>>854
ありがとうございます。トライしてみます。
856 : Name_Not - 2012/06/07(木) 01:43:42.78 ID:??? (+66,+30,-43)
>>853
>再帰しすぎるとよくない
そんな、健康法みたいなw
古い言語や機械だと、再帰でスタックを食い潰す事があったから、
多分その事を言ってるんだと思う。
今時の言語や機械なら、よほど深くならない限りは大丈夫。
857 : Name_Not - 2012/06/07(木) 02:17:10.52 ID:??? (+52,+29,-3)
今時でも再帰しすぎはよくねーよアホ
858 : Name_Not - 2012/06/07(木) 02:20:26.68 ID:Ue5itF0d (+32,+29,-53)
「再帰いくない」「いや問題ない」って聞いて
理由がわからないまま盲目的にどちらかを信じるのがよくねーですな

自分は深くなるときは>>854のようにsetTimeoutで遅延させるんだけど
もっと賢いやり方を教えて欲しい
859 : Name_Not - 2012/06/07(木) 02:31:34.81 ID:??? (+57,+29,-16)
大きすぎるなら再帰なしで書くしかないでしょ。
860 : Name_Not - 2012/06/07(木) 04:20:00.27 ID:??? (+57,+29,-19)
構造が固定なら決めうちでいい

固定じゃないならセイウチ
861 : Name_Not - 2012/06/07(木) 05:23:46.53 ID:??? (+126,+29,-10)
関数呼び出しで時間くうからウン万回と再帰するなら強引にループに直したほうがいいぜ
862 : Name_Not - 2012/06/07(木) 05:58:41.22 ID:??? (-1,-29,-24)
JSON.stringify(obj) して、文字列検索を…なんちゃって。
863 : Name_Not - 2012/06/07(木) 06:24:10.51 ID:??? (+64,+29,+0)
>>861
ああなるほど
864 : Name_Not - 2012/06/07(木) 08:22:58.76 ID:??? (+62,+29,-19)
>>849
いや、だからそれが発端でいろいろ整理された結果が現状なんだけど、またその発端の
方がいいということ?
865 : Name_Not - 2012/06/07(木) 08:37:10.02 ID:??? (+47,+29,-4)
今のでええよ
866 : Name_Not - 2012/06/07(木) 08:38:17.05 ID:??? (+74,+29,-61)
>>850-861 1000レベルの再帰はどのみち動かないでしょ。
>>861-862 文字列にしたら構造が取れなくなるし、1000レベルあるってことは何MBもの文字列?
スタックを使って再帰をループに変換とか定石だと思うんだけど、なぜか
スタックに言及する人が誰もいないという。
867 : Name_Not - 2012/06/07(木) 08:47:35.84 ID:??? (+3,-30,-148)
とりあえず、1000レベルの階層作ってスタックでたどってみました。
<!DOCTYPE html>
<html><head><title>???</title>
</head><body>
<pre><script type="text/javascript">
var obj = new Object(); obj.a0 = 0;
for(var i = 1; i <= 1000; ++i) {
var o = new Object(); o['a'+i] = i; o['b'+i] = obj; obj = o;
}
var stack = []; stack.push(obj);
while(stack.length > 0) {
var e = stack.pop();
for(var k in e) {
if(e[k] instanceof Object) {
document.writeln('prop ' + k + ': object'); stack.push(e[k]);
} else {
document.writeln('prop ' + k + ': ' + e[k]);
}
}
}
</script></pre>
</body></html>
868 : Name_Not - 2012/06/07(木) 11:59:44.57 ID:??? (+91,+29,-4)
テストデータとして、枝は2本以上ある方がいいのでは。
869 : Name_Not - 2012/06/07(木) 12:11:09.02 ID:??? (-6,-29,+0)
> new Object()
870 : Name_Not - 2012/06/07(木) 12:14:16.22 ID:??? (+69,+29,-17)
>>868-869 ぜひとも改良版の投稿を期待しますよ。
871 : Name_Not - 2012/06/07(木) 12:17:25.19 ID:??? (+57,+29,-2)
投稿しても無視だしもういいよ。勝手にやってろよ
872 : Name_Not - 2012/06/07(木) 12:18:52.22 ID:??? (-1,-29,-17)
<title>???</title> の人のテンプレがHTML5仕様になってて和んだ
873 : Name_Not - 2012/06/07(木) 12:36:42.63 ID:??? (+21,-30,-223)
所々で枝分かれするように変更してみますた。
<!DOCTYPE html>
<html><head><title>???</title>
</head><body>
<pre><script type="text/javascript">
var idn = 0, obj = {idn: 0}, level = 0, alt = false, thr = 0.05;
while(level < 1000) {
if(!alt) {
obj = {next: obj, idn: ++idn}; ++level; alt = Math.random() < thr;
if(alt) { obj.alt = {idn: ++idn}; }
} else {
obj.alt = {next: obj.alt, idn: ++idn, branch: true}; alt = Math.random() > thr;
}
}
var stack = []; stack.push(obj);
while(stack.length > 0) {
var e = stack.pop();
for(var k in e) {
if(e[k] instanceof Object) {
document.writeln('prop ' + k + ': object'); stack.push(e[k]);
} else {
document.writeln('prop ' + k + ': ' + e[k]);
}
}
}
</script></pre>
</body></html>
874 : Name_Not - 2012/06/07(木) 12:55:52.00 ID:??? (+36,-30,-41)
たとえばこういうテストデータを…

for(var i = 1; i <= 1000; ++i) {
var o = new Object(); o['a'+i] = i; o['b'+i] = obj; o['c'+i] = obj; obj = o;
}

…って、レベルを1000とかするとえらいことになるが。
875 : Name_Not - 2012/06/07(木) 13:17:48.94 ID:??? (+62,+29,-11)
>>874
それじゃ階層構造(木)じゃなくてDAGじゃん。DAGや一般のグラフを
たどるのだったら、それなりの手当てが必要だよね。大したことはないけど。
876 : Name_Not - 2012/06/07(木) 13:29:36.41 ID:??? (+57,+29,-4)
たらい回し関数を再帰呼び出ししまくるとわかる
877 : Name_Not - 2012/06/07(木) 19:31:23.21 ID:Ue5itF0d (+30,+29,-2)
>>873
足がかりにして勉強します
ありがとうございます
878 : Name_Not - 2012/06/08(金) 13:16:47.51 ID:??? (-3,-30,-130)
jQuery mobileで、ページ要素ごとに使いたいJSファイルが異なる場合、

 $('[data-role="page"]').live('pageshow', function(){
  $.getScript("/js/page-1.js"); // jQMのページ単位で固有のJSをロードする
 });

みたいに、getScript使わないと無理ですかね?
もっとスマートなやり方ってありますか?
879 : Name_Not - 2012/06/08(金) 13:40:53.52 ID:??? (-18,-29,-32)
【jQuery】JavaScript ライブラリ総合質問所 vol.1
http://toro.2ch.net/test/read.cgi/hp/1327814124/
880 : Name_Not - 2012/06/08(金) 14:39:33.50 ID:??? (+94,+28,-4)
>>878
そもそもその設計が変だろ
881 : Name_Not - 2012/06/08(金) 14:43:37.44 ID:??? (+86,+22,-5)
>>878
各ページで全部読み込めばいいじゃんw
グロ汚染するなら切り替えれ
882 : 878 - 2012/06/08(金) 18:26:37.97 ID:??? (+67,+29,-6)
>>879
誘導ありがとうございます。

>>880>>881
たしかにそうですね。
HTML単位で、必要なものをあらかじめ読み込むようにします。
ありがとうございました。
885 : Name_Not - 2012/06/09(土) 07:05:51.80 ID:??? (+7,-10,-2)
ダサいコード
886 : Name_Not - 2012/06/09(土) 09:26:15.04 ID:??? (-10,-29,-53)
>>883-884
いわゆるaddLoadEventだと思いますが、今ならaddEventListenerで充分なような。
IE8-用ですかね。
887 : Name_Not - 2012/06/09(土) 09:30:06.21 ID:??? (-29,-30,-57)
現場の流行ではこう書く。覚えておくといいよ。

window.onload = function() {
    alert("bar");
};
window.onerror = window.onload;
window.onload = function() {
    alert("foo");
    null();
};
888 : Name_Not - 2012/06/09(土) 12:22:53.76 ID:??? (-2,-30,-36)
今更window.onloadを使うん?
addEventListener, attachEvent が普通だと思ってた
889 : Name_Not - 2012/06/09(土) 12:24:43.00 ID:??? (+48,+25,-6)
あれ?
動かないよ
試した?
890 : Name_Not - 2012/06/09(土) 12:37:59.81 ID:??? (+0,-28,+0)
いまさらも何も window.onload は普通に使うでしょ
891 : Name_Not - 2012/06/09(土) 12:40:42.92 ID:??? (+24,+6,+0)
動かない
892 : Name_Not - 2012/06/09(土) 13:36:49.10 ID:??? (+46,+23,-4)
実用のスクリプトには使ってない
893 : Name_Not - 2012/06/09(土) 14:55:46.65 ID:??? (-1,-29,-16)
window.onload は使う必要性がない
894 : Name_Not - 2012/06/09(土) 15:02:55.55 ID:??? (+57,+29,-7)
なんで?
使い分ける必要ないから楽やん
896 : Name_Not - 2012/06/09(土) 15:30:50.64 ID:??? (+34,-30,-183)
var a=[ {x:1} ];

var b=[], c=[];
b[0]=a[0], c[0]=a[0];

b[0].x++;
c[0].x++;
~~~~~~~~~~~~~~~~~~~~~~~
上記のコードを実行すると、b[0].xとc[0].xの中身が
IE9とFirefox13だと2ですが、Chrome19.0.1084.52だと3になってしまいます。
そもそも上記の b[0]=a[0] っていうのは代入ではないのですか?
コピーされる側のa[0]の中身はプロパティ数が増減するため
一つ一つb[0].x=a[0].xのように代入していく以外の方法で、安全に
全プロパティをコピーする方法があったら教えて下さい。
897 : Name_Not - 2012/06/09(土) 15:39:31.36 ID:??? (+3,-29,-63)
896ですが、Chromeのバージョン確認したらアップデートがあって
19.0.1084.56になったら上記のコードの結果が両方とも2になりました…。

アップ前は確かに他ブラウザと同じコードで結果が3になっていた(参照渡しみたいに)のですが。
上のコードは問題ないって事でいいのでしょうか?
898 : Name_Not - 2012/06/09(土) 15:41:59.01 ID:??? (+57,+29,-25)
何度もすいません、やっぱりChromeでは3のままでした。連レス申し訳ないです。
コードの問題点があったら教えていただけるとありがたいです。
899 : Name_Not - 2012/06/09(土) 15:46:14.21 ID:??? (-11,-29,-8)
>>895
別の人が同じ方法でonloadに設定したら実行されないわけだが
900 : Name_Not - 2012/06/09(土) 15:47:57.17 ID:??? (+0,-28,-5)
>>896
IEでもFirefoxでも3になると思うんだけど?
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について