在散列或散列数组上使用#select

时间:2015-07-20 10:52:40

标签: arrays ruby hash

我的哈希值中的值是嵌套哈希:

test_multiple_hash = { test: { another_test: 123 } }

或哈希数组:

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

获取值后,我需要使用#select查找特定的嵌套哈希值:

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

如果我的哈希只有一个哈希,那么除非我将单个哈希转换为数组,否则select不能满足我的需求。

当散列中的键值是单个散列还是散列数组时,是否有更好的方法可以通过键的值查找对象?

3 个答案:

答案 0 :(得分: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.

然后做任何你想做的事情,假设这些值肯定是数组,e。 G:

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

答案 1 :(得分:1)

你可以做到

item.action

答案 2 :(得分: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 }

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