0
function alertJson(obj){  
    if (obj === undefined) return 'undefined\n';
    if (obj === null) return 'null\n';
    for (var k in obj){     
       alert(obj[k]);
       alertJson(obj[k]);   
    }

}

alertJson({
    a: {
        complicatedly: {
            nested: ['object']
        }
    }
});

2つの質問があります...

  1. 4番目のアラートの後もアラートが継続するのはなぜですか?
  2. なぜ[object Object]最初の2つのアイテムを最初に持ってきて、次にobject他の2つのアイテムだけを持ってくるのですか。
4

5 に答える 5

2
  1. 文字列に対して同じ操作を実行しているため、無限ループであるため、"o"呼び出す前にタイプを確認する必要があります。alertJson

  2. toString()オブジェクトを返す[object Object]と、それが返され、オブジェクト自体が文字列オブジェクトになるためです。

コード

function alertJson(obj) {
    //if (obj === undefined) return 'undefined\n';
    //if (obj === null) return 'null\n';
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            var val = obj[prop];
            console.log(val);
            if (val && typeof val === "object") {
                alertJson(val);
            }
        }
    }
}

実行例

またはあなたが使用することができますJSON.stringify(obj)

于 2013-03-13T12:52:42.053 に答える
2

私はあなたが電話したいと思います

alert(k);

それよりも

alert(obj[k]);

alert(k)を使用すると、次のようになります。"a">"複雑に">"ネストされた">0

再帰は、文字列を渡してalertJsonを呼び出すときに発生します。これが発生した場合は、文字列を繰り返し処理し、各文字を使用して(1文字の文字列として)alertJsonを呼び出します。

このフィドルはあなたが期待するものに近いはずです:http://jsfiddle.net/9ZKvf/

于 2013-03-13T12:53:09.870 に答える
2

4番目のアラートの後もアラートが継続するのはなぜですか?

alertJson文字列を呼び出すためです'object'。次に、forループは文字列の各文字を繰り返し処理し、文字列はalertJson各文字を呼び出します。したがって、文字列の終了条件がないため、(文字列の最初の(そして唯一の)文字)などが呼び出さalertJson('o')れます。alertJson('o')

なぜ[object Object]最初の2つのアイテムを最初に持ってきて、次に他の2つのアイテムだけを反対するのですか。

オブジェクトのデフォルトの文字列表現はです[object Object]。配列用のものはそれらの要素の連結であり、配列には要素が1つしかないため、出力はobjectです。文字列'object'は明らかに出力になりますobject

于 2013-03-13T12:55:09.380 に答える
1

2番目の質問に答えるには:

変数obj[k]がアラート関数によって呼び出されると、次のよう.toString()になります。

var a = {};
console.log(a.toString()) // "[object Object]"
var a = [];
console.log(a.toString()) // ""
var a = ["1", "2", "3"];
console.log(a.toString()) // "1,2,3"
于 2013-03-13T12:53:02.760 に答える
0

フェリックス・クリングはあなたの質問に非常に明確に答えたと思います。とにかくここにあなたのコードの更新されたバージョンがあります。

function alertJson(obj){  
    for (var k in obj){
       if(!obj.hasOwnProperty(k))continue;
        alert(k+' : '+obj[k].toString());
        if(typeof obj[k]=='object'){alertJson(obj[k]);}
    }

}

alertJson({
    a: {
        complicatedly: {
            nested: ['object']
        }
    }
});

オブジェクトに独自のプロパティがなく、プロトタイプから継承されていない場合は、その値は必要ないため、スキップして次のプロパティにループします。継続する; ループ内の残りのステートメントを読み取らずに続行するようにループに指示します

if(!obj.hasOwnProperty(k))continue;

文字列オブジェクトを一度に1文字ずつループさせたくない

if(typeof obj[k]=='object'){alertJson(obj[k]);}
于 2013-03-13T13:06:27.053 に答える