从具有匹配键的哈希数组中过滤出哈希



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

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吗?和#。选择,但我在兜圈子。帮助吗?

另一个解决方案是合并Arrays和提取unique的值

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

注意:在合并数组时,变量顺序很重要,如果default_search_orderorder变量之前写入,则结果将不同。

我是这样做的。步骤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

最新更新