元スレ+ JavaScript の質問用スレッド vol.100 +
JavaScript覧 / PC版 /みんなの評価 :
851 :
>>850
中味がオブジェクトか否かを見ながら再起
852 = 851 :
まちがえた
再帰
853 = 850 :
すいません。わからないのでコード教えて下さい。
再帰しすぎるとよくないという話も聞きましたが。。多分、実際のコードでは階層が
千におよぶと思います。
856 = :
>>853
>再帰しすぎるとよくない
そんな、健康法みたいなw
古い言語や機械だと、再帰でスタックを食い潰す事があったから、
多分その事を言ってるんだと思う。
今時の言語や機械なら、よほど深くならない限りは大丈夫。
857 = :
今時でも再帰しすぎはよくねーよアホ
858 = 851 :
「再帰いくない」「いや問題ない」って聞いて
理由がわからないまま盲目的にどちらかを信じるのがよくねーですな
自分は深くなるときは>>854のようにsetTimeoutで遅延させるんだけど
もっと賢いやり方を教えて欲しい
859 = :
大きすぎるなら再帰なしで書くしかないでしょ。
860 = :
構造が固定なら決めうちでいい
固定じゃないならセイウチ
861 = :
関数呼び出しで時間くうからウン万回と再帰するなら強引にループに直したほうがいいぜ
863 = :
>>861
ああなるほど
864 = :
>>849
いや、だからそれが発端でいろいろ整理された結果が現状なんだけど、またその発端の
方がいいということ?
865 = :
今のでええよ
866 = :
>>850-861 1000レベルの再帰はどのみち動かないでしょ。
>>861-862 文字列にしたら構造が取れなくなるし、1000レベルあるってことは何MBもの文字列?
スタックを使って再帰をループに変換とか定石だと思うんだけど、なぜか
スタックに言及する人が誰もいないという。
867 = :
とりあえず、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 = :
テストデータとして、枝は2本以上ある方がいいのでは。
870 = :
>>868-869 ぜひとも改良版の投稿を期待しますよ。
871 = :
投稿しても無視だしもういいよ。勝手にやってろよ
873 = :
所々で枝分かれするように変更してみますた。
<!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 = :
たとえばこういうテストデータを…
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 = :
>>874
それじゃ階層構造(木)じゃなくてDAGじゃん。DAGや一般のグラフを
たどるのだったら、それなりの手当てが必要だよね。大したことはないけど。
876 = :
たらい回し関数を再帰呼び出ししまくるとわかる
877 = 851 :
>>873
足がかりにして勉強します
ありがとうございます
880 = :
>>878
そもそもその設計が変だろ
881 = :
>>878
各ページで全部読み込めばいいじゃんw
グロ汚染するなら切り替えれ
882 = :
>>879
誘導ありがとうございます。
>>880>>881
たしかにそうですね。
HTML単位で、必要なものをあらかじめ読み込むようにします。
ありがとうございました。
885 = :
ダサいコード
889 = :
あれ?
動かないよ
試した?
890 = :
いまさらも何も window.onload は普通に使うでしょ
891 = :
動かない
892 = :
実用のスクリプトには使ってない
894 = :
なんで?
使い分ける必要ないから楽やん
896 = :
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 = :
896ですが、Chromeのバージョン確認したらアップデートがあって
19.0.1084.56になったら上記のコードの結果が両方とも2になりました…。
アップ前は確かに他ブラウザと同じコードで結果が3になっていた(参照渡しみたいに)のですが。
上のコードは問題ないって事でいいのでしょうか?
898 = :
何度もすいません、やっぱりChromeでは3のままでした。連レス申し訳ないです。
コードの問題点があったら教えていただけるとありがたいです。
900 = :
>>896
IEでもFirefoxでも3になると思うんだけど?
類似してるかもしれないスレッド
- + JavaScript の質問用スレッド vol.109 + (1001) - [97%] - 2013/10/7 13:16
- + JavaScript の質問用スレッド vol.130 + (974) - [97%] - 2016/10/26 14:18
- + JavaScript の質問用スレッド vol.130 + (1001) - [97%] - 2017/11/25 20:45
- + JavaScript の質問用スレッド vol.110 + (1001) - [97%] - 2013/10/13 14:01
- + JavaScript の質問用スレッド vol.120 + (1002) - [97%] - 2014/11/8 1:15
- + JavaScript の質問用スレッド vol.108 + (1001) - [97%] - 2013/9/21 15:16
- + JavaScript の質問用スレッド vol.107 + (1001) - [97%] - 2013/9/7 10:16
- + JavaScript の質問用スレッド vol.106 + (1001) - [97%] - 2013/7/20 9:30
- + JavaScript の質問用スレッド vol.140 + (1001) - [97%] - 2019/9/19 10:45
- + JavaScript の質問用スレッド vol.105 + (1001) - [97%] - 2013/5/20 4:45
- + JavaScript の質問用スレッド vol.104 + (1001) - [97%] - 2013/1/28 4:00
- + JavaScript の質問用スレッド vol.103 + (1001) - [97%] - 2012/11/9 15:30
- + JavaScript の質問用スレッド vol.102 + (1001) - [97%] - 2012/9/11 17:30
- + JavaScript の質問用スレッド vol.101 + (1001) - [97%] - 2012/7/16 14:15
- + JavaScript の質問用スレッド vol.121 + (1001) - [95%] - 2015/1/1 18:30
- + JavaScript の質問用スレッド vol.122 + (1004) - [95%] - 2015/2/14 4:45
- + JavaScript の質問用スレッド vol.122 + (116) - [95%] - 2018/5/2 18:30
トップメニューへ / →のくす牧場書庫について