首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按键获取ruby散列值

按键获取ruby散列值
EN

Stack Overflow用户
提问于 2012-03-04 08:42:11
回答 5查看 2.7K关注 0票数 3

我有这样的Hash,表示一个数据树

代码语言:javascript
复制
hash = {
    'key1' => {
         'sub1' => 1,
         'sub2' => 2
    },
    'key2' => 3
}

我想用一个表示路径的键数组来探索树。下面是一些例子:

使用一个简单的路径:

代码语言:javascript
复制
keys = ['key2']

我想让3

使用以下路径:

代码语言:javascript
复制
keys = ['key1', 'sub1']

我想让1

使用无效路径:

代码语言:javascript
复制
keys = ['key1', 'sub1', 'blabla']
keys = ['key1', 'blabla']

获取nil

等等。等等。你明白我的意思了

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-04 08:51:35

代码语言:javascript
复制
keys.inject(hash) {|acc, value| acc[value]}
票数 7
EN

Stack Overflow用户

发布于 2012-03-04 08:52:25

不执行任何错误检查,但是

代码语言:javascript
复制
h = {'k1' => {'s1' => 1, 's2' => 2}, 'k2' => 3}
ks = ['k1', 's1']
ks.inject(h){|hh, k| hh[k]}  # => 1
['k1', 's2'].inject(h){|hh, k| hh[k]} # => 2
['k2'].inject(h){|hh, k| hh[k]} # => 3
票数 4
EN

Stack Overflow用户

发布于 2012-03-04 09:13:43

最好将对象放在心上,让我们向Hash类添加一个功能

代码语言:javascript
复制
# in intialize or whatever
class Hash
  def find_path path #recursive
    key = path.first
    if _path.size == 1 # end of path => return value
      [key]
    elsif [key].kind_of?(Hash) # continue
      [key].find_path path[1..-1]
    else # have to continue but not a has => out
      nil
    end
  end

  def find_path path # not recursive
    _path = path.clone #copy to shift
    _tree = self #start with self
    while(_path.size > 1 && _tree) do #while not the end and _tree 
      _v = _tree[_path.shift]
      _tree = _v.kind_of?(Hash) ? _v : nil
    end
    _tree ? _tree[_path.first] : nil
  end
end

这样:

代码语言:javascript
复制
hash = {:v1 => {:v1.1 => "yes", :v1.2 => "false"}}
hash.find_path [:v1, :v1.1]
# => "yes"
hash.find_path [:v1]
# => {:v1.1 => "yes", :v1.2 => "false"}
hash.find_path [:v2]
# => nil
hash.find_path [:v1, :v1.3]
# => nil
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9551257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档