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']
        }
    }
});

我有两个问题...

  1. 为什么在第四次警报之后警报一直持续?
  2. 为什么它首先[object Object]为前两项带来,然后object为其他两项单独带来。
4

5 回答 5

2

为什么在第四次警报之后警报一直持续?

因为你调用alertJson了字符串'object'。然后 for 循环将遍历字符串的每个字符,依次调用alertJson每个字符。所以它会alertJson('o')再次调用alertJson('o')(字符串的第一个(也是唯一的)字符)等等,因为你没有字符串的退出条件。

为什么它首先[object Object]为前两项带来,然后为其他两项单独带来反对。

对象的默认字符串表示形式是[object Object]. 数组的一个是它们元素的串联,由于数组只有一个元素,所以输出是object. 该字符串'object'显然会导致输出object

于 2013-03-13T12:55:09.380 回答
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”>“complicatedly”>“nested”>0

当您调用传递字符串的 alertJson 时会导致递归。发生这种情况时,您遍历字符串,并使用每个字符(作为 1 字符字符串)调用 alertJson。

这个小提琴应该更接近你的预期:http: //jsfiddle.net/9ZKvf/

于 2013-03-13T12:53:09.870 回答
1

回答你的第二个问题:

当变量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

我认为 Felix Kling 已经非常清楚地回答了你的问题。无论如何,这里是您的代码的更新版本。

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;

我们不希望它一次一个字符地遍历字符串对象

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