Recursively finding children

I’m trying to get a flattened array of children (down to a certain
depth) of a folder (which is using acts_as_tree).

def recursive_find_depth(depth)
if self.children.length > 0 and depth != 0
self.children.each do |child|
puts child.name
child.recursive_find_depth(depth -= 1)
end
end
end

At the moment, the function ‘puts’ the right output, i.e. all the
children under a certain folder to a certain depth. However, I
completely stuck about how to get the finished array of children out of
this function (this shouldn’t be hierarchal, just a flattened array). If
anyone’s wondering what I’m using this for - it’s a webdav system
(PROPFIND). Thanks in advance

Richard Inham wrote:

I’m trying to get a flattened array of children (down to a certain
depth) of a folder (which is using acts_as_tree).

def recursive_find_depth(depth)
if self.children.length > 0 and depth != 0
self.children.each do |child|
puts child.name
child.recursive_find_depth(depth -= 1)
end
end
end

At the moment, the function ‘puts’ the right output, i.e. all the
children under a certain folder to a certain depth. However, I
completely stuck about how to get the finished array of children out of
this function (this shouldn’t be hierarchal, just a flattened array). If
anyone’s wondering what I’m using this for - it’s a webdav system
(PROPFIND). Thanks in advance

Will the Ruby Array.flatten method do what you’re after?

http://www.rubycentral.com/ref/ref_c_array.html#flatten

c.

Cayce B. wrote:

Richard Inham wrote:

I’m trying to get a flattened array of children (down to a certain
depth) of a folder (which is using acts_as_tree).

def recursive_find_depth(depth)
if self.children.length > 0 and depth != 0
self.children.each do |child|
puts child.name
child.recursive_find_depth(depth -= 1)
end
end
end

At the moment, the function ‘puts’ the right output, i.e. all the
children under a certain folder to a certain depth. However, I
completely stuck about how to get the finished array of children out of
this function (this shouldn’t be hierarchal, just a flattened array). If
anyone’s wondering what I’m using this for - it’s a webdav system
(PROPFIND). Thanks in advance

Will the Ruby Array.flatten method do what you’re after?

http://www.rubycentral.com/ref/ref_c_array.html#flatten

c.

def recursive_find_depth(depth)
if self.children.length > 0 and depth != 0
child_array ||= []
self.children.each do |child|
child_array << child
puts child_array.join(’ ,')
child.recursive_find_depth(depth -= 1)
end
return child_array
end
end

Nope. The function above returns the first folder, but not ‘child_array’
(although it ‘puts’ it fine).

Hi –

On Thu, 16 Nov 2006, Richard Inham wrote:

end
end

At the moment, the function ‘puts’ the right output, i.e. all the
children under a certain folder to a certain depth. However, I
completely stuck about how to get the finished array of children out of
this function (this shouldn’t be hierarchal, just a flattened array). If
anyone’s wondering what I’m using this for - it’s a webdav system
(PROPFIND). Thanks in advance

This is untested, but hopefully will either work or give you some
ideas:

def recursive_find_depth(depth, list=[])
unless depth.zero?
children.each do |child|
list.push(child.name)
child.recursive_find_depth(depth-1, list)
end
end
list
end

David


David A. Black | [email protected]
Author of “Ruby for Rails” [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB’s Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] Ruby for Rails | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org

This is untested, but hopefully will either work or give you some
ideas:

Thanks David, works fine!

On 16 November 2006 17:06, Richard Inham wrote:

end

Will the Ruby Array.flatten method do what you’re after?
puts child_array.join(’ ,’)
child.recursive_find_depth(depth -= 1)
end
return child_array
end
end

Nope. The function above returns the first folder, but not ‘child_array’
(although it ‘puts’ it fine).

def nflatten(depth, result = [])
return [] if depth <= 0
self.inject([]) { |result, item| result << item << nflatten(depth-1,
item);
result }
end