我查询了我的数据库,它给了我一个哈希数组,其中哈希中的键是列名。我想只保留哈希(数组元素),根据多个(3列)是唯一的。我试过了:
array.uniq { |item| item[:col1], item[:col2], item[:col3] }
以及
array = array.inject([{}]) do |res, item|
if !res.any? { |h| h[:col1] == item[:col1] &&
h[:col2] == item[:col2] &&
h[:col3] == item[:col3] }
res << item
end
end
有没有人对于什么是错误或其他方式有任何想法?
由于
答案 0 :(得分:0)
如果没有。列是常量,即3你最好创建一个3级哈希,如下所示 无论您想要存储的价值是3级。
out_hash = Hash.new
array.each do |value|
if value[:col1].nil?
out_hash[value[:col1]] = Hash.new
out_hash[value[:col1]][value[:col2]] = Hash.new
out_hash[value[:col1]][value[:col2]][value[:col3]] = value
else if value[:col1][:col2].nil?
out_hash[value[:col1]][value[:col2]] = Hash.new
out_hash[value[:col1]][value[:col2]][value[:col3]] = value
else if value[:col1][:col2][:col3].nil?
out_hash[value[:col1]][value[:col2]][value[:col3]] = value
end
end
我没有测试上面的代码给你一个想法......
答案 1 :(得分:0)
我不清楚你要求的是什么。我最好的猜测是给定单关联哈希的数组:
array = [{:col1 => 'aaa'}, {:col2 => 'bbb'}, {:col3 => 'aaa'}]
您希望每个哈希值只有一个Hash;也就是说,删除最后一个哈希,因为它和第一个哈希都有'aaa'
作为它们的值。如果是这样,那么:
array.uniq{|item| item.values.first}
# => [{:col1=>"aaa"}, {:col2=>"bbb"}]
你想做什么。
我想象的另一种可能性是给定一个这样的数组:
array2 = [{:col1 => 'a', :col2 => 'b', :col3 => 'c', :col4 => 'x'},
{:col1 => 'd', :col2 => 'b', :col3 => 'c', :col4 => 'y'},
{:col1 => 'a', :col2 => 'b', :col3 => 'c', :col4 => 'z'}]
您希望排除最后一个Hash,使其具有与:col1
,:col2
和:col3
相同的值作为第一个哈希值。如果是这样,那么:
array2.uniq{|item| [item[:col1], item[:col2], item[:col3]]}
# => [{:col1=>"a", :col2=>"b", :col3=>"c", :col4=>"x"},
# {:col1=>"d", :col2=>"b", :col3=>"c", :col4=>"y"}]
你想做什么。
如果这些猜测都不是您真正想要的,那么您需要澄清您的要求,最好包括一些样本输入和所需的输出。
我还要指出,很有可能你可以在数据库查询级别完成你想要的东西,这取决于许多未呈现的因素。