【问题标题】:Using #select on either a hash or an array of hashes在散列或散列数组上使用#select
【发布时间】:2015-10-09 11:10:51
【问题描述】:

我的哈希值是嵌套哈希:

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 不适合我的需要,除非我将单个散列转换为数组。

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

【问题讨论】:

  • 什么是test_multiple_hash
  • 酷,无缘无故投反对票?
  • 对于更简单的(嵌套散列)情况,您的预期结果是什么?
  • 这是两个可能的搜索结果中的任何一个的值,如果您阅读我尝试选择的键,您应该将其与我所指的哈希示例联系起来......
  • 这对我来说似乎很清楚。我已经对您的问题进行了大量编辑,以更好地反映我认为您的意思。如果我错了,请您恢复我的编辑吗?

标签: arrays ruby hash


【解决方案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] 不是一个数组。

【讨论】:

    【解决方案2】:

    你可以的

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

    【讨论】:

    • 这个套件是我对这个特定问题的需求,其他解决方案也可以解决问题,但这个看起来更适合上面的问题!谢谢你的建议!我现在正在应用它=)
    【解决方案3】:

    我建议您从创建通用模式的所有基本值开始:

    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.
    

    然后做任何你想做的事情,假设值肯定是数组,例如。 g.:

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

    【讨论】:

    • 非常感谢,这确实帮助我解决了我的问题,并帮助我实现了在整个代码库中处理不同数据模型的有效方法...
    猜你喜欢
    • 2014-05-19
    • 2017-07-02
    • 2012-12-27
    • 2010-12-04
    • 2012-08-03
    • 2012-06-12
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    相关资源
    最近更新 更多