2015-07-20 89 views
0

的值在我的散列的阵列使用#选择要么嵌套散列:在任一个散列或散列

test_multiple_hash = { test: { another_test: 123 } } 

或散列的数组:

test_multiple_hash = { test: [{ another_test: 123 }, { another_test: 124 }] } 

具有取出一个后值,我需要使用#选择查找特定的嵌套哈希:

test_multiple_hash[:test].select { |s| s[:another_test] == 123 } 

如果我的哈希只有一个散列,然后除非将单个散列转换为数组,否则不适合我的需要。

当散列中的某个键的值是单个散列或散列数组时,有没有更好的方法通过键的值来查找对象?

+0

什么是'test_multiple_hash'? – sawa

+0

酷,downvote没有理由为什么? – Bodao

+0

用更简单的(嵌套散列)情况,你的预期结果是什么? – sawa

回答

1

你可以做

[my_hash[:test]].flatten.select { |s| s[:another_test] == 123 } 
+0

此套件是我对这个特定问题的需求,其他解决方案也可以做到这一点,对于上面的问题更清洁!感谢您的建议!我现在正在申请=) – Bodao

2

我建议你开始做通用模式的所有基本价值:

hash = { test: { another_test: 123 }, 
     test2: { test: [{ another_test: 123 }, { another_test: 124 }] } 
     } 

hash.map { |k, v| [k, [*v]] }.to_h # now all of them are arrays. 

然后做你想做的,假设值是绝对的阵列,即摹:

hash.map do |k, v| 
    [k, [*v]] 
end.to_h[:test].select do |s| 
    s[:another_test] == 123 
end 
+0

非常感谢,这确实帮助我解决了我的问题,并帮助我实现了在整个代码库中处理不同数据模型的有效方法...... – Bodao

1

方法Kernel#Array将其参数转换为数组:

2.2.1 :002 > Array(1) 
=> [1] 

除非参数已经是一个数组;然后返回参数不变:

2.2.1 :003 > Array([1]) 
=> [1] 

所以,你可以使用Array函数强制test_multiple_hash[:test]是一个数组:

Array(test_multiple_hash[:test]).select { |s| s[:another_test] == 123 } 

#选择的结果将始终是一个数组,即使test_multiple_hash[:test]不是一个数组。