JS归并遍历对象小练习
归并法遍历对象小练习
思路
对于已知对象,我们可以先将已知属性逐个输出以后再将关键属性拿出来单独作判断,然后归并输出其中的子节点。
对于未知的对象,我们需要先遍历其中的属性,当遍历到某对象为数组时,判断其是否存在子孙节点,若这是一个关键属性,则归并输出这些子孙节点;若该属性不为关键节点,则原样打印。
遍历一个已知对象,并将其结果输出到屏幕上:
function dir( obj, level ) {
function tab() {
for ( var i = 0; i < level; i ++) {
document.write("<p>----</p>");//用于缩进,体现对象结构(此处并不美观)。。。
}
}//根据对象层级来决定缩进的尺寸
//输出缩进+对象属性
tab();document.write("{" + "<br />");
tab();document.write("sign:" + obj.sign + "," + "<br />");
tab();document.write("size:" + obj.size + "," + "<br />");
tab();document.write("isDir:" + obj.isDir + "," + "<br />");
tab();document.write("children:[" + "<br />");
if ( obj.children ) {
for ( var i = 0; i < obj.children.length; i ++) {
dir( obj.children[i], level+1 );
}
}//判断对象是否还有孩子节点,进行递归遍历。
tab();document.write("]" + "<br />");//孩子节点遍历结束
tab();document.write("}" + "<br />");//整个对象遍历结束
}
//示例对象
var disk = {
sign: "C",
size: "50000mb",
isDir: true,
children:
[
{
sign: "Windows",
size: "20000mb",
isDir: true,
children:[
{
sign: "System32",
size: "12000mb",
isDir: true,
children:[{ sign: "char",size: "20k",isDir: false,children: ""}]
},
{
sign: "Explore",
size: "4000k",
isDir: true,
children: [
{
sign: "IE",
size: "8k",
isDir: false,
children: ""
}
]
}
]
},
{
sign: "User",
size: "8000mb",
isDir: true,
children: [
{
sign: "pic",
size: "773k",
isDir: false,
children: ""
}
]
}
]
}
而编辑一个位置的对象,想遍历出其子孙结构,需先找到其中的关键属性,关键属性通常为存储子孙节点的数组;得到结果后再进行递归输出。
function ergodic( obj, level ) {
//缩进控制
function tab() {
for ( var i = 0; i < level; i ++) {
document.write("<p>----</p>");
}
}
tab();document.write( "{" + "<br />" );
for ( var attr in obj ) { //遍历对象的所有属性
//判断是否为对象类型,即判断是否有可能为存储子孙节点的数组
if ( obj[attr] instanceof Object ) {
tab();document.write( attr + ":" + "[" + "<br />" );
++level; //层级提升
for ( var j = 0; j < obj[attr].length; j ++) {
ergodic( obj[attr][j], level );
}
--level; //层级回归(都是为缩进服务)
tab();document.write("]" + "<br />" );//关键属性遍历结束
} else {
//document.write( typeof(obj[attr]) );//测试过程中用于查看上文判断是否bug
tab();document.write( attr +":" + obj[attr] + "," + "<br />");//若不为关键属性,则直接输出其内容
}
}
tab();document.write( "}" + "<br />" );//遍历完成,递归封闭。
}

浙公网安备 33010602011771号