Ruby拒绝嵌套在数组中的散列

  • 本文关键字:数组 拒绝 嵌套 Ruby 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[: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

最新更新