擦除空白Json循环

时间:2014-07-26 22:54:11

标签: ruby-on-rails ruby json

我有一个rails后端接收JSON(解析时)看起来像:

[
   {"kind"=>"Magazine", "price"=>["$20.99"]},
   {"kind"=>"Book", "price"=>"", "title"=>""}
]

基本上我想要做的是针对每种产品(例如杂志或书籍),如果 kind 键以外的所有其他属性都是空白的,那么请不要保存该数组核心价值。所以在我的例子中,Magazine会保留在数组中,但是Book类型会被删除(因为属性价格和标题都是空白的。

我知道我可以循环使用类似的东西(列表是以前解析过的JSON):

list.each do |l|
    if l["kind"] == "Magazine"
       if l["price"].blank?
          # THEN DELETE THIS ITERATION
       end
    end
end 

但这似乎非常重复而且不干净。我该如何做得更好?

2 个答案:

答案 0 :(得分:2)

执行此操作的惯用方法是使用Array#reject!删除不需要的行。您也可以只提取值,删除空白值,并计算剩余的值......确保'kind'是其中之一......

list.reject! {|item| item.values.reject(&:blank?).size < 2 && item['kind'].present?}

请注意rejectreject!之间的差异... ... !方法会修改新哈希值。

答案 1 :(得分:1)

您可以使用方法扩展Hash以删除空值(这也支持嵌套哈希):

class Hash
  def delete_blank
    delete_if{|k, v| v.blank? or v.instance_of?(Hash) && v.delete_blank.blank?}
  end
end

删除空白值后,如果只剩下一个键且为kind,则删除数组元素:

list.each do |l|
  l.delete_blank
end
list.reject! {|l| l.key?('kind') && l.length < 2}

#=> [{"kind"=>"Magazine", "price"=>["$20.99"]}]