假设我有一个像这样的哈希数组
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_order
在order
变量之前写入,则结果将不同。
我是这样做的。步骤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