2010-03-30 41 views
37

Có cách nào (trong jQuery hoặc JavaScript) để lặp qua từng đối tượng và đó là trẻ em và cháu và như vậy?looping thông qua một đối tượng (cây) đệ quy

Nếu vậy ... tôi cũng có thể đọc tên của họ không?

Ví dụ:

foo :{ 
    bar:'', 
    child:{ 
    grand:{ 
     greatgrand: { 
     //and so on 
     } 
    } 
    } 
} 

nên vòng lặp nên làm một cái gì đó như thế này ...

loop start 
    if(nameof == 'child'){ 
    //do something 
    } 
    if(nameof == 'bar'){ 
    //do something 
    } 
    if(nameof =='grand'){ 
    //do something 
    } 
loop end 

Trả lời

58

Bạn đang tìm kiếm for...in loop:

for (var key in foo) 
{ 
    if (key == "child") 
     // do something... 
} 

Be lưu ý rằng các vòng lặp for...in sẽ lặp qua bất kỳ thuộc tính nào có thể đếm được, kể cả các thuộc tính được thêm vào nguyên mẫu của một đối tượng. Để tránh tác động lên các đặc tính này, bạn có thể sử dụng phương pháp hasOwnProperty để kiểm tra xem tài sản chỉ thuộc về đối tượng đó:

for (var key in foo) 
{ 
    if (!foo.hasOwnProperty(key)) 
     continue;  // skip this property 
    if (key == "child") 
     // do something... 
} 

Thực hiện vòng lặp đệ quy có thể đơn giản như viết một hàm đệ quy:

// This function handles arrays and objects 
function eachRecursive(obj) 
{ 
    for (var k in obj) 
    { 
     if (typeof obj[k] == "object" && obj[k] !== null) 
      eachRecursive(obj[k]); 
     else 
      // do something... 
    } 
} 
+2

@Val: nó sẽ rất khó để sụp đổ trình duyệt với đối tượng đệ quy. Các đối tượng sẽ cần phải có một tham chiếu đến chính nó như là một trong những tài sản :-) –

+1

thử: '(a = {}) ._ = a' – Annan

+3

@ Annan: có, đó là nhiều hơn hoặc ít hơn những gì tôi đã nhận được tại. Vấn đề đơn giản là không làm điều đó ;-) –

0

Nếu bạn muốn lấy lại một cây quan hệ bạn có thể sử dụng Object.keys đệ quy.

function paths(item) { 
 
    function iter(r, p) { 
 
    var keys = Object.keys(r); 
 
    if (keys.length) { 
 
     return keys.forEach(x => iter(r[x], p.concat(x))); 
 
    } 
 
    result.push([p]) 
 
    } 
 
    var result = []; 
 
    iter(item, []); 
 
    return result; 
 
} 
 

 
var data = { 
 
    foo: { 
 
    bar: '', 
 
    child: { 
 
     grand: { 
 
     greatgrand: {} 
 
     } 
 
    } 
 
    } 
 
} 
 

 
console.log(paths(data));

Các vấn đề liên quan