Ruby Как преобразовать плоский массив в хэш

#ruby #hash

#ruby #хэш

Вопрос:

У меня есть следующий хэш.

 @facet_counts = {"facet_queries"=>{}, 
 "facet_fields"=>
      {"product_collection_value"=>["traditional and imitation", 304, "chunky", 34, "modern", 15, "coloured gems", 12, "traditional", 0, "traditional amp; imitation", 0],
       "product_material_value"=>["alloy", 161, "metal alloy", 132, "metal", 60, "925 sterling silver", 8, "lac", 3, "beads", 2, "beaded", 0, "brass", 0, "copper", 0, "crystal", 0, "fabric", 0, "feather", 0, "glass", 0, "jute", 0, "leather", 0, "pashmina", 0, "plastic", 0, "polymer beads", 0, "pu leather", 0, "rexin", 0, "rubber", 0, "satin", 0, "shell", 0, "silk", 0, "silk brocade", 0, "silver", 0, "silver alloy", 0, "stainless steel", 0, "sterling silver", 0, "stone", 0, "velvet", 0, "viscose", 0, "wood", 0, "wooden", 0, "wool", 0],
       "product_type_value"=>["jhumkis", 364, "danglers", 53, "drops", 7, "hoops", 6, "victorian", 2, "armlets", 0, "bands", 0, "bangles", 0, "beaded", 0, "beads", 0, "bib", 0, "chains", 0, "charms", 0, "choker", 0, "clip on", 0, "cluster", 0, "cluster pendant necklaces", 0, "clusters", 0, "cocktail", 0, "contemporary", 0, "cuff", 0, "cz", 0, "diamond look", 0, "double chain", 0, "double fold", 0, "double strand", 0, "earrings", 0, "fashion", 0, "gemstone", 0, "hasli", 0, "hath phool", 0, "kada", 0, "kamarband", 0, "kundan", 0, "link", 0, "links", 0, "maang tika set", 0, "mangalsutras", 0, "modern", 0, "oxidised", 0, "oxidized", 0, "pair", 0, "pearl", 0, "pendant", 0, "pendant necklaces", 0, "potli", 0, "pouch", 0, "rani haar", 0, "rings", 0, "saree pins", 0, "set", 0, "single chain", 0, "single fold", 0, "single stone", 0, "single strand", 0, "singles", 0, "sling bag", 0, "strings", 0, "studded", 0, "studs", 0, "thewa", 0, "tote bag", 0, "traditional", 0, "with chain", 0, "with gemstone", 0, "without chain", 0, "without gemstone", 0], 
       "product_plating_value"=>["yellow gold plating", 135, "gold plating", 98, "silver", 39, "black silver", 15, "rhodium", 2, "white rhodium", 1, "14k yellow gold", 0, "18k yellow gold", 0, "alloy", 0, "black gold", 0, "black rhodium", 0, "brass", 0, "cubic zirconia", 0, "oxidised", 0, "pearl", 0, "rose gold", 0, "rose gold plating", 0, "silver plating", 0, "sterling silver", 0, "yellow gold", 0, "yellow rhodium", 0],
       "product_gemstones_value"=>["cubic zirconia", 132, "pearl", 45, "semi-precious", 19, "crystal", 3, "precious", 3, "amethyst", 2, "citrine", 2, "garnet", 2, "peridot", 2, "green onyx", 1, "imitation kundan", 1, "iolite", 1, "aquamarine", 0, "black onyx", 0, "blue topaz", 0, "carnelian", 0, "chalcedony", 0, "coral", 0, "diamond", 0, "emerald", 0, "gem stones", 0, "green stone", 0, "howlite", 0, "hydro", 0, "jade", 0, "jasper", 0, "kundan", 0, "labradorite", 0, "lapis", 0, "lemon quartz", 0, "lemon stone", 0, "malachite", 0, "marcasite", 0, "moonstone", 0, "onyx", 0, "opal", 0, "pink amethyst", 0, "prehnite", 0, "quartz", 0, "rainbow", 0, "red onyx", 0, "red stone", 0, "red tiger eye", 0, "rhodolite", 0, "rose quartz", 0, "ruby", 0, "sapphire", 0, "smoky quartz", 0, "spinel", 0, "tanzanite", 0, "tiger eye", 0, "topaz", 0, "tourmaline", 0, "turquoise", 0, "white rainbow", 0, "white rainbow stone", 0],
       "product_occasion_value"=>["special occasions or gifts", 358, "wedding or festive wear", 245, "everyday wear", 119, "work wear", 4, "religious", 0]
  },
 "facet_dates"=>{}, 
 "facet_ranges"=>{}}
 

То, что я хочу, чтобы хэш соответствовал результатам поиска на странице. Массив против каждого имени файла указывает значения и количество результатов, имеющих это значение. Но поскольку это массив, я не могу легко получить доступ к подсчетам.

То, что я сейчас делаю, это:

     facet_fields=["product_collection_value","product_material_value","product_type_value","product_plating_value","product_gemstones_value","product_occasion_value"]
    @count_hash = Hash.new
    facet_fields.each {|field|
        print @facet_counts["facet_fields"][field]
        @facet_counts["facet_fields"][field].each_with_index{ |v,i|
            if i%2 == 1
                next
            else
                @count_hash[@facet_counts["facet_fields"][field][i]] = @facet_counts["facet_fields"][field][i 1]
            end
        }

        print "nn"
    }
 

Проблема: это создает новый хэш. Но проблема в том, что в случае нескольких записей одного и того же тега. Например Modern , находится внутри product_collection_value , и product_type_value поэтому значение перезаписывается. Есть ли способ, с помощью которого я могу преобразовать исходный хэш, чтобы можно было легко получить доступ к подсчетам?

Комментарии:

1. Непонятно, что вы пытаетесь сделать. Публикация вашего кода не помогает. Вместо того, чтобы делать это, объясните, чего вы хотите.

2. @sawa: Спасибо за предложение. Я соответствующим образом обновил вопрос. Пожалуйста, просмотрите

3. Вот несколько советов по написанию вопросов: 1. Предоставьте входные данные. (Вы это сделали.) 2. Уменьшите количество элементов во входных данных до минимума, необходимого для вопроса. 3. Сократите текстовые строки, имена символов и т. Д. («cv» вместо «значение коллекции продуктов»). 4. Форматирование, чтобы избежать необходимости горизонтальной прокрутки. 5. Обеспечьте желаемый выходной сигнал, соответствующий входному сигналу. (Часто вопрос можно понять только из этого.)

Ответ №1:

ответ таков: Hash[@facet_counts["facet_fields"].map { |k, v| [k, Hash[*v]] }]

Ответ №2:

Я верю, что вы пытаетесь это сделать:

 @count_hash = @facet_counts['facet_fields'].map do |k, v| 
  Hash[*v] 
end.inject({}) do |s, i| 
  s.merge(i) { |_, old, new| old   new }
end
 

Например, первая часть сопоставляет каждое поле фасета с хэшем пар ключ-значение — первая будет выглядеть так:

 {"traditional and imitation"=>304, 
 "chunky"=>34, "modern"=>15, "coloured gems"=>12, 
 "traditional"=>0, "traditional amp; imitation"=>0}
 

Вторая часть объединяет их путем суммирования идентичных ключей. Результат вашего примера будет выглядеть примерно так:

 {"traditional and imitation"=>304, "chunky"=>34, "modern"=>15, 
 "coloured gems"=>12, "traditional"=>0, "traditional amp; imitation"=>0, 
 "alloy"=>161, "metal alloy"=>132, "metal"=>60, "925 sterling silver"=>8, 
 "lac"=>3, "beads"=>2, "beaded"=>0, "brass"=>0, "copper"=>0, "crystal"=>3, 
 "fabric"=>0, "feather"=>0, "glass"=>0, "jute"=>0, "leather"=>0, "pashmina"=>0,
 "plastic"=>0, "polymer beads"=>0, "pu leather"=>0, "rexin"=>0, "rubber"=>0, 
 "satin"=>0, "shell"=>0, "silk"=>0, "silk brocade"=>0, "silver"=>39, 
 "silver alloy"=>0, "stainless steel"=>0, "sterling silver"=>0, ... }