从散列数组中的每个散列中删除一个项目

时间:2015-06-05 21:39:49

标签: arrays ruby hash

我有一系列像这样的哈希:

array = [{
  "id"=>"ABC",
  "account"=>"XYZ", 
  "date"=>"2014-07-21",
  "amount"=>200,  
  "score"=>{"location"=>{"city"=>1, "state"=>1}, "name"=>1},
  "cat"=>#<Tipper::Category:0xb666fb0
    @type={"primary"=>"special"},
    @hierarchy=["Transfer","Withdrawal", "ATM"],
    @id="21012002"
  >,  
  "state"=>"CA"
},
{"id=>"XYZ","account"=>"987"}]

我想迭代数组中的每个哈希并删除&#34;类别&#34;从每个散列中分段并生成一个没有&#34;类别的散列数组&#34;任何哈希中的项目。我试过这个:

filtered_array = array.reject { |t| array.include? t['cat'] }

这不是这样做的。

2 个答案:

答案 0 :(得分:1)

您可以使用地图和删除

这将对散列的实际实例起作用,因此数组将被修改。

array.each{ |hash| hash.delete('cat') }

你可以这样做以获得一个新阵列,并保持第一个不被触及。

new_array = array.map do |hash| 
   new_hash = hash.dup
   new_hash.delete('cat')
   new_hash
}

答案 1 :(得分:1)

假设你有一个哈希数组:

array = [ {"id" => 1, "name" => "bob", "cat" => "dog"}, 
          {"id" => 2, "name" => "jim", "cat" => "mouse"}, 
          {"id" => 1, "name" => "nick", "cat" => "fish"} ]

您可以执行以下操作:

array.map { |hash| hash.reject {|k, v| k == "cat" } }

这会返回一个新的哈希数组,删除cat对,同时仍然保留原始数组:

=> [{:id=>1, :name=>"bob"}, {:id=>2, :name=>"jim"}, {:id=>1, :name=>"nick"}]

希望它有所帮助!