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

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

JavaScript覧 / PC版 /
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter

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 = :

あれ?
動かないよ
試した?

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になると思うんだけど?


←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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