gpt4 book ai didi

ruby - 在 Ruby 中递归遍历哈希

转载 作者:数据小太阳 更新时间:2023-10-29 07:23:25 26 4
gpt4 key购买 nike

我在使用这个遍历哈希的函数时遇到了问题。哈希可能包含一个哈希数组。我希望该方法搜索一个 id,然后只返回它找到的嵌套哈希。

遍历好像可以,但是返回的是传入的原始值。

require 'rubygems'
require 'ruby-debug'

def find_by_id(node, find_this="")
if node.is_a?(Hash)
node.each do |k,v|
if v.is_a?(Array)
v.each do |elm|
if elm["_id"] == find_this && !find_this.empty?
return elm # THIS IS WHAT I WANT!
else
find_by_id(elm, find_this)
end
end
end
end
end
end

x = {"name" => "first", "_id"=>'4c96a9a56f831b0eb9000005', "items"=>["name" => "second", "_id"=>'4c96a9af6f831b0eb9000009', "others"=>[{"name" => "third", "_id"=>'4c96a9af6f831b0eb9000007'}, {"name" => "fourth", "_id"=>'4c96a9af6f831b0eb9000008'}] ] }

find_by_id(x, '4c96a9af6f831b0eb9000008')

最佳答案

当您递归调用find_by_id 时,您不会对返回值做任何事情。您需要检查它是否找到了某些东西,如果是,则返回它,即:

result = find_by_id(elm, find_this)
return result if result

您还需要在方法结束时(在每个循环之后)返回 nil,因此如果未找到任何内容,它会返回 nil。如果你不这样做,它将返回 each 的返回值,这是你迭代过的散列。

编辑:

这是包含我概述的更改的完整代码:

def find_by_id(node, find_this="")
if node.is_a?(Hash)
node.each do |k,v|
if v.is_a?(Array)
v.each do |elm|
if elm["_id"] == find_this && !find_this.empty?
return elm # THIS IS WHAT I WANT!
else
result = find_by_id(elm, find_this)
return result if result
end
end
end
end
end
# Return nil if no match was found
nil
end

编辑2:

另一种方法,我发现更清晰,是将迭代结构的逻辑与查找具有正确 id 的元素的逻辑分开:

def dfs(hsh, &blk)
return enum_for(:dfs, hsh) unless blk

yield hsh
hsh.each do |k,v|
if v.is_a? Array
v.each do |elm|
dfs(elm, &blk)
end
end
end
end

def find_by_id(hsh, search_for)
dfs(hsh).find {|node| node["_id"] == search_for }
end

通过使 dfs 返回一个 Enumerable,我们可以使用 Enumerable#find 方法,这会使代码更简单一些。

如果您需要编写另一个需要递归遍历哈希的方法,这也可以实现代码重用,因为您可以重用 dfs 方法。

关于ruby - 在 Ruby 中递归遍历哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3748744/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com