[{"a"=>1},{"b"=>4}]},{"value"=>[{"c"=>4},{"d"=>3},{"a"=>3},{"b"=>54}]-6ren">
gpt4 book ai didi

ruby-on-rails - Ruby group_by 具有不同键的哈希数组(键不固定)

转载 作者:数据小太阳 更新时间:2023-10-29 08:35:50 24 4
gpt4 key购买 nike

我想将散列数组分组为:

array = [{"value"=>[{"a"=>1},{"b"=>4}]},{"value"=>[{"c"=>4},{"d"=>3},{"a"=>3},{"b"=>54}]}]

到:

grouped_data = {"a"=>[1,3],"b"=>[4,54],"c"=>[4],"d"=>[3]}

我可以将数组转换为array#1 = [{"a"=>1}, {"b"=>4}, {"c"=>4}, {"d"=>3}, {"a"=> 3}, {"b"=>54}] 使用 array.map(&:values).flatten。我可以使用遍历所有数据将 array#1 转换为散列 grouped_data 的原样。但我需要一种更有效的方法,比如在动态键上使用 group_by(键不固定。)

如果键是固定的,我知道如何分组。我需要对动态更改的键进行 group_by。

最佳答案

我不希望为此赢得任何可读性奖项...

array.map(&:values)
.flatten
.group_by { |o| o.keys.first }
.map { |key, v| [key, v.map(&:values).flatten] }
.to_h
=> {"a"=>[1, 3], "b"=>[4, 54], "c"=>[4], "d"=>[3]}

如果有人好奇,我整理了一些粗略的基准:

require 'benchmark'

n = 10000
letters = ('a'...'z').to_a
numbers = (0...1000).to_a

built_array = []
n.times do |i|
values = []
obj_size = (1...letters.size).to_a.sample
obj_size.times do |j|
values << {
"#{letters.sample}" => numbers.sample
}
end
built_array << { "value" => values }
end

Benchmark.bm(15) do |x|
x.report("anthony") { anthony(built_array) }
x.report("eric each") { eric_each(built_array) }
x.report("eric ewo") { eric_each_with_object(built_array) }
x.report("eric merge") { eric_merge(built_array) }
x.report("ed inject") { ed_inject(built_array) }
end

user system total real
anthony 0.130000 0.010000 0.140000 ( 0.146601)
eric each 0.060000 0.000000 0.060000 ( 0.067160)
eric ewo 0.070000 0.000000 0.070000 ( 0.076125)
eric merge 25.250000 0.880000 26.130000 ( 28.297592)
ed inject 0.080000 0.010000 0.090000 ( 0.111045)

关于ruby-on-rails - Ruby group_by 具有不同键的哈希数组(键不固定),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41875442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com