2015-08-24 5 views
-1

Я ищу, чтобы удалить ключи из хэша, которые имеют значение nil. article - класс хранения каждого товара, а метод attributes хранит статью как хэш.Удалить нулевые значения из hash

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

{"articles":[{"results":[{"author":null,"title":"Former bar manager jailed for preying on homeless 14-year-old girl","summary":"<p><img src=\"http://images.theage.com.au/2015/08/24/6790912/Thumbnail999662740gisd08image.related.thumbnail.320x214.gj68pg.png1440386418031.jpg-90x60.jpg\" width=\"90\" height=\"60\" style=\"float:left;margin:4px;border:0px\"/></p>A man who preyed on a 14-year-old girl he came across living on the streets of&#160;Wodonga has been jailed for nine months.","images":null,"source":null,"date":"Mon, 24 Aug 2015 03:20:21 +0000","guid":"<guid isPermaLink=\"false\">gj68pg</guid>","link":"http://www.theage.com.au/victoria/former-bar-manager-jailed-for-preying-on-homeless-14yearold-girl-20150824-gj68pg.html","section":null,"item_type":null,"updated_date":null,"created_date":null,"material_type_facet":null,"abstract":null,"byline":null,"kicker":null}]}]} 

Глядя удалить нулевые значения из приведенного выше вывода.

def attributes 
    hash = { 
    "author" => @author, 
    "title" => @title, 
    "summary" => @summary, 
    "images" => @images, 
    "source" => @source, 
    "date" => @date 
    } 
    hash = {} 
    count = 0 
    article.attributes.each do |key,value| 
    if value == nil 
     hash[count] = article.attributes.delete(key) 
     count += 1 
    end 
    end 
    hash.to_json 

В результате, как показано ниже:

{"0":null,"1":null,"2":null,"3":null,"4":null,"5":null,"6":null,"7":null,"8":null,"9":null,"10":null} 
+0

Пожалуйста, убедитесь, что код размещен мчит и завершается. Я попытался запустить его и вообще не вижу выхода. Кроме того, данные, которые вы упомянули как «ожидаемый результат», похоже, не являются частью кода, может быть, добавить минимальный пример для воспроизведения проблемы? – FriendFX

+0

FriendFX - код разлагается на несколько классов, и это будет невозможно. Второй фрагмент кода - это проблема. Код не будет запущен, потому что не определен класс статьи. Я пытаюсь удалить ключи без значений из article.attributes (хранение статей). – coder05

+0

Посмотрите на [Как создать минимальный, полный и проверенный пример] (https://stackoverflow.com/help/mcve) для получения некоторых рекомендаций. Кажется, что ваш код касается только хэша ('article.attributes'?), И вы хотите удалить некоторые элементы, поэтому, возможно, измените свой пример таким образом, чтобы внешних зависимостей не было. Кроме того, я думаю, что «конец» отсутствует. – FriendFX

ответ

0

Данный вход является действительным JSON, и вопрос имеет тег JSON, поэтому я хотел бы предложить общее решение проблемы рекурсивного устранения ключей в объектах JSON, где бы они ни происходили, и независимо от того, какой может быть входной JSON.

Решение написано на новом JSON-ориентированном языке программирования jq, но даже если вы не можете использовать jq, решение настолько кратким и элегантным, что оно может предложить реализацию общей проблемы на выбранном вами языке.

Вот это - один вкладыш:

walk(if type == "object" then with_entries(select(.value != null)) else . end) 

Это предполагает JQ версии 1.5 (см https://stedolan.github.io/jq/).

Если у вас установлена ​​более старая версия jq, можно легко добавить определение walk/1. (Смотри, например, Transforming the name of key deeper in the JSON structure with jq)

7

Как о попытке:

hash = article.attributes.select {|k, v| v } 

Если значение false или nil, атрибут будет игнорироваться.

Если вы хотите сохранить ложное значение и только устранить nil, вы можете запустить:

hash = article.attributes.select {|k, v| !v.nil? } 
+0

Я забыл, что 'Hash' имеет' select', который возвращает хэш ([Hash # select] (http://ruby-doc.org/core-2.2.0/Hash.html#method-i-select)) –

+0

Это случается со мной все время. Я просто предполагаю, что мои проблемы являются общими (даже когда они не являются) и тратят время на поиск документации Ruby - я даже загрузил автономную версию ;-) – Myst

0

В моем случае я использую уточнений к Hash класс

module HashUtil 
    refine Hash do 
     # simple but can not adapt to nested hash 
     def squeeze 
      select{|_, v| !v.nil? } 
     end 
     # complex but can adapt to nested hash 
     def squeeze_deep 
      each_with_object({}) do |(k, v), squeezed_hash| 
       if v.is_a?(Hash) 
        squeezed_hash[k] = v.squeeze 
       else 
        squeezed_hash[k] = v unless v.nil? 
       end 
      end 
     end 
    end 
end 

class Article 
    using HashUtil 
    def attributes 
     hash = { 
      "author" => @author, 
      "title" => @title, 
      "summary" => @summary, 
      "images" => @images, 
      "source" => @source, 
      "date" => @date 
     } 
     hash.squeeze 
    end 
end 
+0

Я нашел, что простое сжатие такое же, как у ActiveSupport Hash # compact. Простите за это.https://apidock.com/rails/Hash/compact –

Смежные вопросы