2014-07-26 50 views
0

我有一個導軌後端是臨危的JSON(解析時)看起來像:擦除空白的Json環

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

基本上就是我想要做的是爲每一種產品(如雜誌或書),如果除類別鍵之外的所有其他屬性均爲空白,則不要保存該數組鍵/值。所以在我的例子中,Magazine會留在數組中,但Book類會被刪除(因爲這兩個屬性的價格和標題都是空白的)

我知道我可以通過類似的東西循環(列表是解析的JSON之前) :

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

但這似乎很重複和不乾淨怎麼辦這更好

回答

2

慣用的方式做這將涉及使用Array#reject!刪除不需要的線。您也可以只提取值,刪除空白的,並計算剩餘價值......確保「類」就是其中之一......

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

通知rejectreject!之間的區別.. 。返回一個新的散列,而!方法修改它。

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"]}] 
+0

擴展散列和刪除鍵聽起來像它有太多的副作用。 – DGM