2013-12-12 34 views
6

Tôi đang cố gắng tạo một hàm sẽ tạo ra cấu trúc cây giống như mỗi mục chứa một tham chiếu đến mục cha của nó.Tham chiếu hàm đệ quy Javascript

Tôi có một chức năng tự gọi khi tạo trẻ nhưng có thời gian khó khăn với nó, có vẻ như khi nó được gọi từ bên trong, this vẫn đề cập đến mục cấp cao nhất thay vì mục hiện tại.

Đăng nhập vào bảng điều khiển mục mà tôi có thể thấy rằng cha mẹ luôn đề cập đến mục đầu tiên trong chuỗi (hoặc vắng mặt) khi sâu hơn cấp đầu tiên. Nó tạo ra cây, nhưng các tham chiếu đến cha mẹ bị mất cho các mục bên cạnh cái đầu tiên.

var Item = function (item, parent) { 
    console.log('item is :' + item.name); 
    this.parent = parent; 
    console.log('parent is: ' + parent); 
    var fields = _.union(_.keys(item), _.keys(this.parent)); 
    _.each(_.without(fields, ['parent','children']), function (prop) { 
    this[prop] = angular.isDefined(item[prop]) ? item[prop] : this.parent[prop]; 
    }, this); 

    this.children = []; 
    if (item.children) { 
    this.children = _.map(item.children, function (child) { 
     console.log('this is : ' + this); 
     return new Item(child, this) 
    }, this); 
    } 
}; 

var tree = new Item(root, {}); 

Có một chút khó khăn trong việc fiddle đi, nhưng đây là một số dữ liệu mẫu:

var root = JSON.parse('{"id":"1","name":"root item","root":"1","lft":"1","rgt":"22","level":"1","type": 
"category","parent_id":"1","deadline":null, 
"children":[ 
{"id":"2","name":"item 1","root":"1","lft":"14","rgt":"15","level":"2","type":"category","parent_id":"1"}, 
{"id":"6","name":"item 2","root":"1","lft":"16","rgt":"19","level":"2","type":"category","parent_id":"1"}, 
{"id":"10","name":"item 3","root":"1","lft":"20","rgt":"21","level":"2","type":"item","parent_id":"1"}]}'); 
+0

Chỉ là lỗi đánh máy, tôi đã thử nghiệm và quên thay đổi lại trước khi đăng. Cố định nó ở đây, vấn đề vẫn như cũ. – JPR

+1

Bạn có thể tạo fiddle cho điều này với một số dữ liệu giả? –

+0

Chắc chắn, có thể mất vài phút để kết hợp với nhau. Cảm ơn. – JPR

Trả lời

1

Vấn đề là ở việc bạn sử dụng các _.without method. Các phần tử để loại trừ được chuyển thành một số biến số của các đối số, không phải là một mảng.

sử dụng sai:

_.without(['a','b'],['a']) 

kết quả trong ['a', 'b'] (không phải những gì bạn muốn)

Trong đó:

_.without(['a','b'],'a') 

mang lại kết quả mong đợi của bạn: ['b']

Dưới đây là một updated fiddle với sửa chữa.

Lưu ý: để tránh tham chiếu tuần hoàn, tôi in ra parent.id thay vì parent trong kết quả "Kết quả".

1

Nó hiện công việc cho tôi. Tôi đơn giản hóa mã một chút và thêm mục cháu. Có một cái nhìn: http://jsfiddle.net/7QYQL/1/

var grandchild = {}; 
grandchild.name = 'grandchild'; 
var child = {}; 
child.name = 'child'; 
child.children = []; 
child.children[0] = grandchild; 
var root = {}; 
root.name = 'root'; 
root.children = []; 
root.children[0] = child; 

Vấn đề được _.without() mà phải mất một danh sách khá sau đó một mảng như một tham số thứ hai.

_.without(fields, 'parent','children') 

Cái này hoạt động: http://jsfiddle.net/eRbhm/13/

+0

Xin cảm ơn và rất nhiều ý kiến ​​cho điều đó. Tôi đã thử câu trả lời đầu tiên của bạn và nó đã làm việc nhưng mã của tôi vẫn không và tôi không thể tìm ra cách của bạn về cơ bản khác với những gì tôi đang làm. Sửa chữa _.without cố định nó ngay lập tức, tôi đã hoàn toàn bỏ qua nó. – JPR

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