我有大量数据:
[{"id"=>"3"}, {"id"=>"9"}]
{"id"=>"27"}
{"id"=>"5"}
{"id"=>"11"}
[{"id"=>"9"}, {"id"=>"23"}, {"id"=>"11"}, {"id"=>"19"}, {"id"=>"7"}, {"id"=>"5"}, {"id"=>"25"}, {"id"=>"13"}, {"id"=>"15"}, {"id"=>"3"}, {"id"=>"21"}, {"id"=>"17"}, {"id"=>"31"}]
{"id"=>"17"}
{"id"=>"13"}
[{"id"=>"13"}, {"id"=>"7"}, {"id"=>"5"}]
[{"id"=>"9"}, {"id"=>"11"}, {"id"=>"19"}, {"id"=>"5"}, {"id"=>"25"}, {"id"=>"13"}, {"id"=>"15"}, {"id"=>"3"}, {"id"=>"21"}, {"id"=>"17"}]
[{"id"=>"9"}, {"id"=>"3"}]
[{"id"=>"21"}, {"id"=>"11"}, {"id"=>"7"}, {"id"=>"5"}, {"id"=>"25"}]
{"id"=>"5"}
[{"id"=>"25"}, {"id"=>"5"}, {"id"=>"3"}, {"id"=>"21"}]
{"id"=>"3"}
{"id"=>"11"}
[{"id"=>"13"}, {"id"=>"33"}, {"id"=>"7"}, {"id"=>"5"}, {"id"=>"37"}, {"id"=>"31"}]
[{"id"=>"13"}, {"id"=>"7"}, {"id"=>"5"}, {"id"=>"21"}]
有没有办法对它进行排序:
arrays = all_arrays_here
hashes = all_hashes_here
所有这些都在数组中。
答案 0 :(得分:3)
假设这些数据存在于某种可枚举对象中,您可以这样做:
arrays, hashes = data.group_by(&:class).values_at(Array, Hash)
但感觉不对。很可能你更需要将每个哈希包装在它自己的数组中(这样你以后可以加倍迭代)。如果是这种情况:
data.map! {|array_or_hash| Array.wrap(array_or_hash)}
答案 1 :(得分:2)
@BroiSatse首先做了同样的事情,但我认为能够看到Ruby做的事情很重要....
考虑一下:
foo = [[1], {a: 2}, %w[3 4], {b: 5, c: 6}].group_by{ |e| e.class }
foo # => {Array=>[[1], ["3", "4"]], Hash=>[{:a=>2}, {:b=>5, :c=>6}]}
Ruby的内置group_by
就是针对这类问题而制作的。
以此为基础:
arrays, hashes = foo.values_at(Array, Hash)
arrays # => [[1], ["3", "4"]]
hashes # => [{:a=>2}, {:b=>5, :c=>6}]
values_at
按照指定的顺序从散列(在本例中)中检索值。
答案 2 :(得分:0)
a = [
[{"id"=>"3"}, {"id"=>"9"}],
{"id"=>"27"},
{"id"=>"5"},
{"id"=>"11"},
[{"id"=>"9"}, {"id"=>"23"}, {"id"=>"11"}],
{"id"=>"17"}
]
arrays, hashes = a.inject([[], []]) do |accum, item|
item.is_a?(Array) ? accum[0] << item : accum[1] << item
accum
end
因此,您将数组和散列与变量a
分开编辑:更喜欢@ BroiSatse的解决方案。