【问题标题】:Filtering out hashes from arrays of hashes that have matching keys从具有匹配键的哈希数组中过滤出哈希
【发布时间】:2021-02-07 15:42:23
【问题描述】:

假设我有一个这样的哈希数组

default_search_order = [
    { field: 'subscribers.nickname',   direction: 'ASC' },
    { field: 'subscribers.email',      direction: 'ASC' },
    { field: 'roles.name',             direction: 'ASC' },
    { field: 'subscribers.first_name', direction: 'ASC' }
]

我有另一个由这样的查询提供的哈希数组:

order = [
    { :field => "subscribers.nickname",  :direction => "DESC"},
    { :field => "subscribers.email",     :direction => "DESC"},
    { :field => "subscribers.last_name", :direction => "DESC"}
]

我想从 default_search_order 中过滤掉具有匹配字段值的哈希,然后将两个哈希数组组合成一个哈希数组,就像这样。

correct = [
    { field: "subscribers.nickname",   direction: "DESC"},
    { field: "subscribers.email",      direction: "DESC"},
    { field: "subscribers.last_name",  direction: "DESC"},
    { field: "roles.name",             direction: "ASC" },
    { field: "subscribers.first_name", direction: "ASC" }
]

我将如何在 Ruby on Rails 中做到这一点?我一直在尝试#.delete_if?和#.keep_if?和 #.select 但我要绕圈子。帮忙?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-hash


    【解决方案1】:

    另一种解决方案是合并 Arrays 和提取 unique

    correct = (order + default_search_order).uniq { |f| f[:field] }
    
    correct = order.push(*default_search_order).uniq { |f| f[:field] }
    

    注意:这里变量顺序很重要,如果default_search_order写在order变量之前,那么结果会不同。

    【讨论】:

    • 这正是我最终这样做的方式!谢谢
    【解决方案2】:

    我会这样做。第 1 步是按字段索引 default_search_order - 将其从数组转换为哈希:

    indexed = default_search_order.index_by { |hsh| hsh[:field] }
    

    现在你有了这样的数据结构:

    {
      'subscribers.nickname'   => { field: 'subscribers.nickname',   direction: 'ASC' },
      'subscribers.email'      => { field: 'subscribers.email',      direction: 'ASC' },
      'roles.name'             => { field: 'roles.name',             direction: 'ASC' },
      'subscribers.first_name' => { field: 'subscribers.first_name', direction: 'ASC' }
    }
    

    通过这样做,我们的工作变得简单,因为我们可以立即知道第一个列表中的哪个条目对应于第二个给定的field,并对其进行更新(或者如果它不存在则设置它但是)。

    order.each do |hsh|
      indexed[hsh[:field]] = hsh
    end
    

    最后,我们可以通过删除我们的临时“索引”(哈希键)将其转回数组

    results = indexed.values
    

    另一种方法与第一种方法类似,但更简洁:

    [default_search_order, order]
      .map { |list| list.index_by { |hsh| hsh[:name] } }
      .reduce(&:merge)
      .values
    

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 2020-07-16
      • 2022-07-06
      • 1970-01-01
      • 2018-06-14
      • 2014-07-12
      • 2014-12-30
      • 2015-09-18
      • 1970-01-01
      相关资源
      最近更新 更多