2016-11-04 74 views
1

我有一个包含多个子对象的对象,我想检索所有元素。 当运行下面的代码,我只检索要素的一部分,直到“年龄”如何用子对象读取对象

var output = ''; 
 
    
 
    var main_table = { 
 
    \t \t animal: 'dog', 
 
    \t \t color:'black', 
 
    \t \t age: { 
 
       year:2016, 
 
       month:11, 
 
       day:1 
 
      }, 
 
    \t \t race:'sheepdog', 
 
    \t \t parents: { 
 
       father:'Dad', 
 
    \t \t \t mother:'Mom' 
 
      } 
 
}; 
 
    
 
function test(main_table){ 
 
    table=main_table; 
 
    for (var name in table) { 
 
     if (table.hasOwnProperty(name)) { 
 
     if (table[name]=="[object Object]") { 
 
      test(table[name]); 
 
     } 
 
     else { 
 
      output+=(name+' : '+table[name]+' '); 
 
     } 
 
     } 
 
    } 
 
    alert (output); 
 
} 
 

 
test(main_table)

一些关于它的帮助将得到高度赞赏。

+1

[通过嵌套JavaScript对象迭代]的可能的复制(HTTP:// stackoverflow.com/questions/8085004/iterate-through-nested-javascript-objects) – Weedoze

回答

2

您创造了一个隐含的全局变量这一行:

table=main_table; 

被遗漏了var

我也重构了一点点,以在每个递归阶段返回output,并在末尾返回alert

var main_table = { 
 
    \t \t animal: 'dog', 
 
    \t \t color:'black', 
 
    \t \t age: 
 
    \t \t { 
 
       year:2016, 
 
       month:11, 
 
       day:1 
 
      }, 
 
    \t \t race:'sheepdog', 
 
    \t \t parents: 
 
    \t  { 
 
       father:'Dad', 
 
    \t \t \t mother:'Mom'} 
 
    \t \t }; 
 
    
 
function test(main_table){ 
 
    var table=main_table; 
 
    var output = ''; 
 
    for (var name in table) 
 
    { 
 
     if (table.hasOwnProperty(name)) 
 
     { 
 
     console.log(name, typeof table[name]) 
 
     if (typeof table[name]== "object") 
 
     { 
 
      output+=test(table[name]); 
 
     } 
 
     else 
 
     { 
 
      output+=(name+' : '+table[name]+' '); 
 
     } 
 
     } 
 
    } 
 
    return output; 
 
} 
 

 
alert(test(main_table))

0

我建议使用迭代,在键和递归,在孩子的方式,以适当的检查

if (object[key] !== null && typeof object[key] === 'object') { //... 

的迭代对象。

方法使用:

function getElements(object) { 
 
    var result = []; 
 
    Object.keys(object).forEach(function (key) { 
 
     if (object[key] !== null && typeof object[key] === 'object') { 
 
      result = result.concat(getElements(object[key])); 
 
      return; 
 
     } 
 
     result.push([key, object[key]]); 
 
    }); 
 
    return result; 
 
} 
 

 
var main_table = { animal: 'dog', color: 'black', age: { year: 2016, month: 11, day: 1 }, race: 'sheepdog', parents: { father: 'Dad', mother: 'Mom' } }; 
 

 
console.log(getElements(main_table));
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

嗨设置了错误的范围,你的功能,因为这条线table=main_table;

这个代码将工作的我想:

var output = ''; 

var main_table = { 
     animal: 'dog', 
     color:'black', 
     age: 
      {year:2016,month:11,day:1}, 
     race:'sheepdog', 
     parents: 
      {father:'Dad', 
      mother:'Mom'} 
     }; 

function test(table){ 
for (var name in table) 
    { 
    if (table.hasOwnProperty(name)) 
     { 
     if (table[name]=="[object Object]") 
      { 
      test(table[name]); 
      } 
     else 
      { 
      output+=(name+' : '+table[name]+' '); 
      } 
     } 
    } 
alert(output); 
} 

test(main_table);