2013-01-24 46 views
6

ai đó có thể giải thích mã này? Tôi không nhận được những gì bên trong cấu trúc "for".chuyển đổi một mảng thành một cây

var tree = {} 

function addToTree(tree, array) { 
    for (var i = 0, length = array.length; i < length; i++) { 
     tree = tree[array[i]] = tree[array[i]] || {} 
    } 
} 

addToTree(tree, ["a", "b", "c"]) 
addToTree(tree, ["a", "b", "d"]) 

/*{ 
    "a": { 
     "b": { 
      "c": {}, 
      "d": {} 
     } 
    } 
}*/ 
+1

Uh ... mã này có hoạt động không? Nếu vậy thì tôi cũng muốn biết chuyện gì đang xảy ra. –

+0

Nó hoạt động chuyển đổi một mảng thành một cây, giống như một cây đối tượng, mã nhận xét là đầu ra cho cây. Đây là bài đăng gốc: http://stackoverflow.com/q/3663096/2007780 –

+2

Đó là một số mã xấu! – bfavaretto

Trả lời

1

Tôi đã mở rộng phần thân của vòng lặp for và thêm một số nhận xét nhằm làm cho mọi thứ rõ ràng hơn.

for (var i = 0, length = array.length; i < length; i++) { 
    // Assign the current item in the array to a variable 
    var current = array[i]; 

    // If there is no property on the "tree" object corresponding to the value of 
    // "current", set this property to a new object 
    if (!tree[current]) { 
     tree[current] = {}; 
    } 

    // Set the "tree" variable to the field in the "tree" object whose 
    // name corresponds to "current". On the next loop iteration, "tree" will 
    // refer to this "child" object, resulting in a tree-like object being 
    // created as we iterate. 
    tree = tree[current]; 
} 
+0

Ồ, tôi hiểu ngay! Lúc đầu, tôi nghĩ rằng chúng tôi đã viết trên giá trị của cây trong phạm vi toàn cục, nhưng 'cây' là tên của tham số hàm, cũng vậy! –

+2

@DanielAllenLangdon Đúng - điều đó làm cho bài đăng của OP không cần thiết khó hiểu, bởi vì giá trị của 'cây' trong phạm vi' addToTree' sẽ bị ràng buộc với bất kỳ thứ gì được truyền vào, trong ví dụ ban đầu cũng xảy ra là biến toàn cầu được gọi là ' tree'. – Donut

+0

tuyệt vời Tôi đã tìm kiếm điều này cả ngày. thanks –

1

Điều này gây nhầm lẫn trước khi tham chiếu đến tree bên trong hàm đổ bóng biến bên ngoài có cùng tên. Nhưng do các tham chiếu hoạt động như thế nào trong JavaScript, nó sẽ kết thúc việc sửa đổi biến bên ngoài.

Dưới đây là những gì nó làm, từng bước, xem xét chỉ cuộc gọi đầu tiên:

  1. Gọi chức năng với một tham chiếu đến tree (có nghĩa là {}) và ["a", "b", "c"] như các đối số
  2. Vòng mảng.
    1. Kiểm tra xem đã có thuộc tính "a" trong cây chưa; nếu không, tạo ra nó với giá trị {}
    2. Cây đầy đủ bây giờ trông như { a : {} }
    3. Bây giờ xem xét các cây chúng tôi đang làm việc trên là tree.a (đó là trống)
    4. Kiểm tra nếu có đã là một tài sản "b" trong cây hiện tại; nếu không, tạo ra nó với giá trị {}
    5. Cây đầy đủ bây giờ trông như { a : { b: {} } }
    6. Bây giờ xem xét các cây chúng tôi đang làm việc trên là tree.a.b (đó là trống)
    7. Kiểm tra nếu có đã là một tài sản "c" trong cây hiện tại; nếu không, tạo ra nó với giá trị {}
    8. Cây đầy đủ bây giờ trông như { a : { b: { c: {} } } }
    9. Bây giờ xem xét các cây chúng tôi đang làm việc trên là tree.a.b.c (đó là trống rỗng)
  3. End chức năng
+0

Cảm ơn sự giúp đỡ của bạn, tôi hiểu rất rõ –

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