Ruby 按日期优化哈希的分组数组
给定数组Ruby 按日期优化哈希的分组数组,ruby,arrays,algorithm,sorting,hash,Ruby,Arrays,Algorithm,Sorting,Hash,给定数组 [ {date: '2014-01-01', a: 5, b:1}, {date: '2014-01-01', xyz: 11}, {date: '2014-10-10', qbz: 5}, {date: '2014-10-10', v: 4, q: 1, strpm: -99} ] 我想按日期分组并输出哈希数组 ouput = [ {date: 2014-01-01, a: 5, b:1, xyz: 11 }, {date: 2014-10-10, qbz: 5
[
{date: '2014-01-01', a: 5, b:1},
{date: '2014-01-01', xyz: 11},
{date: '2014-10-10', qbz: 5},
{date: '2014-10-10', v: 4, q: 1, strpm: -99}
]
我想按日期分组并输出哈希数组
ouput = [
{date: 2014-01-01, a: 5, b:1, xyz: 11 },
{date: 2014-10-10, qbz: 5, v: 4, q: 1, strpm: -99},
]
我正在用Ruby解决这个问题,并且有了一个解决方案,但它似乎效率低下
def arrayt(inputarray)
outputarray=[];
inputarray.each do |x|
tindex = includes(outputarray,x[:date])
if tindex == -1
outputarray.push(x)
else
outputarray[tindex].merge!(x)
end
end
return outputarray
end
def includes(array,date)
array.each_with_index do |temp,index|
if date==temp[:date]
return index
end
end
return -1
end
如果您能提供更优雅的解决方案,我们将不胜感激这里有一种采用aka合并形式的方法!使用块确定合并的两个哈希中存在的键的值:
[
{date: '2014-01-01', a: 5, b:1},
{date: '2014-01-01', xyz: 11},
{date: '2014-10-10', qbz: 5},
{date: '2014-10-10', v: 4, q: 1, strpm: -99}
]
.group_by(&:first).map{|_, v| v.inject(:merge)}
arr.each_with_object({}) { |g,h|
h.update({ g[:date]=>g }) { |_,ov,nv| ov.merge(nv) } }.values
也就是说:
hash = arr.each_with_object({}) { |g,h|
h.update({ g[:date]=>g }) { |_,ov,nv| ov.merge(nv) } }
#=>{"2014-01-01"=>{:date=>"2014-01-01", :a=>5, :b=>1, :xyz=>11},
# "2014-10-10"=>{:date=>"2014-10-10", :qbz=>5, :v=>4, :q=>1, :strpm=>-99}}
hash.values
#=> [{:date=>"2014-01-01", :a=>5, :b=>1, :xyz=>11},
# {:date=>"2014-10-10", :qbz=>5, :v=>4, :q=>1, :strpm=>-99}]
不确定是否可以在ruby中执行此操作,但如果可以,可以使用每个数组元素的第一个元素作为哈希或字典键,然后将其后的任何元素附加到该哈希槽中。使用group_by,然后获取可能更适合代码审阅的.value。