Сгруппировать массив хешей по значению и сохранить структуру (ha sh) в Ruby - PullRequest
0 голосов
/ 19 июня 2020

У меня есть ha sh вот так:

  hash = {
    'en-us': {
      where: 'USA'
    },
    'en-us-zone2': {
      where: 'USA'
    },
    'en-nl': {
      where: 'Netherlands'
    },
    'en-pt': {
      where: 'Portugal'
    },
  }

И я попытался сгруппировать их, используя group_by:

result = hash.group_by { |k,v| v[:where] }

Однако он возвращает полный массив, а не по массиву хешей. Итак, вот ожидаемые и фактические результаты:

Фактический результат:

{ "USA"=>  
  [[:"en-us", {:where=>"USA"}], [:"en-us-zone2", {:where=>"USA"}]], 
 "Netherlands"=>
  [[:"en-nl", {:where=>"Netherlands"}]],
 "Portugal"=>
  [[:"en-pt", {:where=>"Portugal"}]]
}

Ожидаемый результат:

{ "USA"=>
   [{:"en-us" => {:where=>"USA"}}, {:"en-us-zone2" => {:where=>"USA"}}]
  "Netherlands"=>
   [{:"en-nl" => {:where=>"Netherlands"}}]
  "Portugal"=>
   [{:"en-pt" => {:where=>"Portugal"}}]
}

См. Фактическое значение - это массив массивов, а не массив хеши. Ha sh keys становится первым элементом массива.

Как я могу сгруппировать свои ha sh на основе :where?

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Уродливо, но работает:

hash = {
  'en-us': {
    where: 'USA'
  },
  'en-us-zone2': {
    where: 'USA'
  },
  'en-nl': {
    where: 'Netherlands'
  },
  'en-pt': {
    where: 'Portugal'
  },
}

hash.
  group_by { |_, v| v[:where] }.
  map do |k, v|
    [
      k,
      v.map { |a, b| {a => b} }
    ]
  end.to_h

# => {"USA"=>[{:"en-us"=>{:where=>"USA"}}, {:"en-us-zone2"=>{:where=>"USA"}}], "Netherlands"=>[{:"en-nl"=>{:where=>"Netherlands"}}], "Portugal"=>[{:"en-pt"=>{:where=>"Portugal"}}]}
1 голос
/ 19 июня 2020

Это должно работать:

hash.group_by { |k,v| v[:where] }.each { |_, v| v.map! { |array| { array[0] => array[1] } } }

Или с transform_values ​​

hash.group_by { |k,v| v[:where] }.transform_values { |v| v.map { |array| {array[0] => array[1] } } }

https://ruby-doc.org/core-2.4.0/Hash.html#method -i-transform_values ​​

...