2014-01-19 79 views
0

我在此post的帮助下创建了jsfiddle。递归循环适用于JSON原始数据,但在从PHP数组读取JSON数据时不起作用。递归循环浏览JSON数据

var notes = '<?php echo json_encode($notes); ?>'; 

console.log(notes); // displays JSON raw data (used in jsfiddle) 

在循环遍历数据之后,我想根据类型获取特定输出:主题,主题,副主题,概念,段落。

我该如何解决这个问题?

+0

var notes = <?php echo json_encode($ notes); ?>;'?否则它被视为字符串字面值而不是对象 –

+0

感谢@ m59的建议。 – h4kl0rd

回答

3

删除引号:var notes = <?php echo json_encode($notes); ?>;

的报价使它成为一个字符串,而不是一个对象。

如果你想将它写成一个字符串,那么你需要将其从字符串转换成JSON:

var notes = JSON.parse('<?php echo json_encode($notes); ?>'); 

要访问对象属性在for循环中,做到这一点:

for (var key in myObj) { 
    console.log(myObj[key]); 
} 

您可以使用点符号或括号表示来访问属性。点符号通常被认为是更清洁的,尽管它更有限。考虑这个对象:

var myObj = { 
    foo : "some value", 
    bar : "some other value", 
    "1&^@" : "this value's key is invalid!" 
}; 

访问那些是有效的javascript变量名键属性,可以使用点表示法是这样的:

console.log(myObj.foo); //"some value" 
console.log(myObj.bar); //"some other value" 

第三属性不会以这种方式工作。因为它包含否则无效字符,它必须作为一个字符串被创建,并且必须作为字符串进行访问,所以使用括号表示法:

console.log(myObj['1&^@']); 

约括号标记另一个很酷的事情是,你可以使用变量作为关键名称。 (也参见上面的for循环)。

var foo = 'bar'; 

var myObj = { 
    bar : 123 
}; 

console.log(myObj[foo]); //123 

这工作,因为foo'bar'值,所以myObj[foo]相当于myObj['bar']myObj.bar

+0

谢谢。有用。 – h4kl0rd

+0

循环访问值后,如何根据类型(主题)获取内容(物理)。例如。 {“id”:“750”,“content”:“Physics”,“type”:“Subject”} – h4kl0rd

+0

我大大更新了我的答案。在你的答案的例子中,点符号通常是首选。 – m59

0

在@ m59的帮助下,我设法遍历JSON数据并获取特定数据。这是jsfiddle

if (obj['type'] == 'Subject') { 
    body += 'SubjectId:' + obj['id'] + '<br>'; 
    body += 'SubjectContent:' + obj['content'] + '<br>'; 

    var topics = obj['children']; 
    var topic; 
    for (topic in topics) { 
     body += 'topicId:' + topics[topic]['id'] + '<br>'; 
     body += 'topicContent:' + topics[topic]['content'] + '<br>'; 
     body += 'topicType:' + topics[topic]['type'] + '<br>'; 
    } 
}