【问题标题】:Filter an array of hashes to keep only those elements whose hashes contain a key contained in an array?过滤散列数组以仅保留散列包含数组中包含的键的那些元素?
【发布时间】:2020-12-13 03:33:39
【问题描述】:

这里我们有一个哈希数组。我们如何只保留数组中至少包含一个键的哈希值?

# array of hashes
@arr_of_h = [{first: 10},
{second: 10, secondB: 10},
{third: 10, thirdB: 10}]

# array
arr = ["first", "third"]

期望的输出

@output = [{:first=>10}, {:third=>10, :thirdB=>10}]

【问题讨论】:

  • 如果散列可以有多个键,我建议您修改示例,使@arr_of_h 的至少一个元素是具有多个键的散列。在任何情况下,您都需要编辑您的问题以阐明哈希是否始终只有一个键。
  • @CarySwoveland 我明白你的意思(如果问题/解决方案解决的是一般问题而不是具体问题,则对社区更有用)。我认为这个问题可以很容易地编辑,但我不确定答案?如果它造成了一个令人困惑的情况,我可以提出一个新问题,指定每个散列的多个键(并编辑这个问题以专注于每个散列一个键,因此不必更改答案)。但我会接受你的建议。告诉我什么是最好的,我会做的
  • @CarySwoveland 不错。我想我相应地编辑了这个问题。如果它没有意义或可以变得更简单/更容易推广,请随时编辑
  • @CarySwoveland 我认为三个答案中有两个适用于更新后的问题,所以我只评论了一个不适用的答案。如果不正确请告知。谢谢你的建议。我认为努力是值得的,以便让未来到达这里的任何人的生活变得轻松
  • @CarySwoveland 我认为现在一切都井井有条

标签: arrays ruby hashmap


【解决方案1】:

Array select试试下面的:

select 将返回一个数组,其中包含与块上提供的条件匹配的元素。

希望数组每个索引的哈希值只包含一个键

 @arr_of_h.select{ |element| arr.include?(element.keys.first.to_s) }

编辑#1

查找数组中至少有一个键的记录

我们可以通过Array selectArray any?来实现

 @arr_of_h.select{ |element| element.keys.any? {|element| arr.include?(element.to_s) }}

【讨论】:

  • 非常感谢您的回答!这对我帮助很大! @Cary 指出这个问题模棱两可,所以我澄清并使其更具普遍性。是否可以更新答案以匹配更新后的问题?
  • 当然@stevec 更新了答案。
【解决方案2】:

如果您的数组中有多个键的散列,并且如果其中一个散列键存在于“保留”数组中,您希望保留散列,这将起作用。

arr_of_h.delete_if { |hash| (arr & (hash.keys.map(&:to_s))).empty? }

正如 Cary 正确指出的那样,这确实会改变数组。如果你不想改变数组:

arr_of_h.select { |hash| (arr & (hash.keys.map(&:to_s))).any? }

【讨论】:

    【解决方案3】:

    如果速度很重要,并且如果数组有很多元素,这意味着很多查找,请使用set。此外,为了提高速度,请在开始时将数组转换为符号,而不是在 select 循环中进行转换。请注意,对于 OP 描述的特定情况,如果有任何改进,速度将是很小的,因为所有输入都很小。

    require "Set"
    @arr_of_h = [{first: 10}, {second: 10}, {third: 10}]
    arr = ["first", "third"]
    arr_as_set = arr.map(&:to_sym).to_set
    @output = @arr_of_h.select { |h| arr_as_set.include?(h.keys.first) }
    puts @output
    # Prints: 
    # {:first=>10}
    # {:third=>10}
    

    另请参阅:

    Set#include? docs
    Set#include? vs. Array#include?
    More on Set#include?
    Speed comparisons for arrays, sets, and hashes, with benchmarks

    【讨论】:

      猜你喜欢
      • 2016-08-03
      • 2018-04-08
      • 1970-01-01
      • 2016-01-27
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 2012-03-21
      相关资源
      最近更新 更多