排序数组和哈希

时间:2014-10-24 15:34:08

标签: ruby-on-rails ruby arrays

我有大量数据:

[{"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

所有这些都在数组中。

3 个答案:

答案 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的解决方案。