繁体   English   中英

如何删除哈希数组中的键和值?

[英]How I can delete key and value in array of hash?

我需要删除 hash 数组中的所有键 created_at 和 updated_at 。 我的哈希看起来像:

assessment_with_desc = {
  "id": 1,
  "name": "First assessment",
  "created_at": "2020-03-14T20:13:27.006Z",
  "updated_at": "2020-03-14T20:13:27.006Z",
  "description_with_child_models": [
    {
      "id": 3,
      "title": "First category",
      "created_at": "2020-02-20T15:32:46.379Z",
      "updated_at": "2020-03-14T20:16:11.530Z",
      "accessment_id": 1,
      "sub_categories": [
      {
        "id": 1,
        "title": "First sub_category",
        "category_id": 3,
        "created_at": "2020-02-20T15:40:49.793Z",
        "updated_at": "2020-02-20T15:40:49.793Z",
        "stages": [
        {
          "id": 5,
          "title": "First stage",
          "sub_category_id": 1,
          "created_at": "2020-02-20T15:44:10.603Z",
          "updated_at": "2020-02-20T15:44:10.603Z"
        }
       ]
      }
     ]
    }
  ]
}

我做到了,但它只在这种情况下有效assessment_with_desc.delete('created_at')assessment_with_desc.delete('updated_at')

assessment_with_desc.delete('created_at')
assessment_with_desc.delete('updated_at')
assessment_with_desc['description_with_child_models'].delete('created_at')
assessment_with_desc['description_with_child_models'].delete('updated_at')
assessment_with_desc['description_with_child_models'][0]['sub_categories'].delete('created_at')
assessment_with_desc['description_with_child_models'][0]['sub_categories'].delete('updated_at')
assessment_with_desc['description_with_child_models'][0]['sub_categories'][0]['stages'].delete('created_at')
assessment_with_desc['description_with_child_models'][0]['sub_categories'][0]['stages'].delete('updated_at')

如果键等于:created_at:updated_at您可以递归调用函数来删除键/值:

def recursively_delete_timestamps(object)
  object.transform_values do |value|
    next value unless value.is_a?(Array)

    value.map do |inner_hash|
      recursively_delete_timestamps(inner_hash)
    end
  end.reject do |key, _|
    key.in?(%i[created_at updated_at])
  end
end

recursively_delete_timestamps(assessment_with_desc)
# {:id=>1,
#  :name=>"First assessment",
#  :description_with_child_models=>
#   [{:id=>3,
#     :title=>"First category",
#     :accessment_id=>1,
#     :sub_categories=>
#      [{:id=>1,
#        :title=>"First sub_category",
#        :category_id=>3,
#        :stages=>[{:id=>5, :title=>"First stage", :sub_category_id=>1}]}]}]}

请注意,哈希值保持不变。 也不是transform_valuesmapreject修改原始对象,而是返回一个新对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM