我试图拒绝数组中的特定哈希。由于的嵌套,我感到困惑
我有一个散列,看起来像这个
hash = {
"key1":
[
{
"name": "foo",
"id": 1
},
{
"name": "foo",
"id": 2
},
{
"name": "bar",
"id": 3
}
],
"key2":
[
{
"name": "foo",
"id": 1
},
{
"name": "foo",
"id": 2
},
{
"name": "bar",
"id": 3
}
]
}
我需要对每个值进行迭代,并修改数组以拒绝任何具有hash[:name] == "bar"
的哈希,同时保持其他所有内容不变。
我正在试用
hash = hash.each_value do |value|
value.reject {|v| v[:name] == "bar"}
end
=> {:key1=>[{:name=>"foo", :id=>1}, {:name=>"foo", :id=>2}, {:name=>"bar", :id=>3}],
:key2=>[{:name=>"foo", :id=>1}, {:name=>"foo", :id=>2}, {:name=>"bar", :id=>3}]}
我可以用这样的东西去除它们:
hash.values.flatten.reject {|v| v[:name] == "bar"}
=> [{:name=>"foo", :id=>1}, {:name=>"foo", :id=>2}, {:name=>"foo", :id=>1}, {:name=>"foo", :id=>2}]
但我需要初始散列来保持完整的
我期望得到这个:
hash = {
"key1":
[
{
"name": "foo",
"id": 1
},
{
"name": "foo",
"id": 2
}
],
"key2":
[
{
"name": "foo",
"id": 1
},
{
"name": "foo",
"id": 2
}
]
}
我也尝试过这种路线:
hash.reject do |key, value|
value.each do |r|
r[:name] == "bar"
end
end
=> {}
非常感谢任何帮助-我想解释一下我的逻辑在哪里不好
我知道我在错误地迭代,这只是让我对所有嵌套的有点困惑
@Schwern已经发现了代码中的问题,所以我只建议一个更像Ruby的解决方案。
hash = {
"key1": [{ "name": "foo", "id": 1 },
{ "name": "foo", "id": 2 },
{ "name": "bar", "id": 3 }],
"key2": [{ "name": "foo", "id": 1 },
{ "name": "foo", "id": 2 },
{ "name": "bar", "id": 3 }]
}
hash.transform_values { |arr| arr.reject { |h| h[:name] == "bar" } }
#=> { "key1": [{ "name": "foo", "id": 1 },
# { "name": "foo", "id": 2 }],
# "key2": [{ "name": "foo", "id": 1 },
# { "name": "foo", "id": 2 }]
# }
请参阅哈希#transform_values。注意,hash
没有突变。要就地修改hash
,请使用哈希#transform_values!。
您不是在修改哈希,而是在修改哈希中的值。hash = hash.each_value
什么都不做(并且each_value
的返回值没有记录)。
value.reject
确实拒绝了这些值,但没有到位。它返回一个新数组,并保留原来的数组。
a = ["foo", "bar", "baz"]
# The modified array: ["foo", "baz"]
p a.reject { |v| v == "bar" }
# The original array is untouched: ["foo", "bar", "baz"]
p a
使用reject!
在适当的位置修改每个阵列。
hash.each_value do |value|
value.reject! {|v| v[:name] == "bar"}
end