我有一个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
但这似乎非常重复而且不干净。我该如何做得更好?
答案 0 :(得分:2)
执行此操作的惯用方法是使用Array#reject!删除不需要的行。您也可以只提取值,删除空白值,并计算剩余的值......确保'kind'是其中之一......
list.reject! {|item| item.values.reject(&:blank?).size < 2 && item['kind'].present?}
请注意reject
和reject!
之间的差异... ... !
方法会修改新哈希值。
答案 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"]}]