Как вести учет всех элементов внутри хешей, которые находятся внутри массива? - PullRequest
0 голосов
/ 15 марта 2019

В принципе, у меня есть массив, который содержит 3 хэша. Я хочу посчитать и вернуть каждый ключ и значение в хешах, которые включают любые дубликаты. Код ниже, я сделал первый набросок кода, как вы можете убедиться ниже.

my_array = [{:name => "blake"}, {:name => "blake"}, {:name => "ashley"}]
 #Count the number of times each element appears inside the hash
 #so the output should have the number of times the :names, "blake" and "ashley" element appears
 #EXPECTED OUTPUT: :name = 3, "blake" = 2, "ashley" = 1

def getOccurances(array)
  array.group_by{|v| v[:name]}.map{|k,v| {name: k, count: v.length}}
end 

getOccurances(my_array)
#ACTUAL OUTPUT: {:name => "blake", :count => 2}, {:name => "ashley", :count => 1}

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Вы можете сопоставить каждый хеш с массивом пар [key, val], затем сгладить и каждое вхождение:

[{:name => "blake"}, {:name => "blake"}, {:name => "ashley"}].
    map(&:to_a).flatten.
    reduce(Hash.new { 0 }) {|o, v| o[v] += 1; o }

Аргументом reduce является хеш, инициализированный блоком, поэтомузначение по умолчанию неинициализированных ключей - 0;мы просто перебираем сведенные записи и накапливаем количество значений.

0 голосов
/ 15 марта 2019
my_array.each_with_object(Hash.new(0)) { |g,h| h[g[:name]] += 1 }.
         map { |k,v| { name: k, count: v } }
  #=> [{:name=>"blake", :count=>2}, {:name=>"ashley", :count=>1}]

Примечание:

my_array.each_with_object(Hash.new(0)) { |g,h| h[g[:name]] += 1 }
  #=> {"blake"=>2, "ashley"=>1} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...