Ruby 基于模式从哈希中删除元素

Ruby 基于模式从哈希中删除元素,ruby,hash,Ruby,Hash,我有一个如下所示的散列: { "cell_number" => 1234567, "lead source" => [ "referrel", "web", "ad" ], "lead source_selected" => "web" } 现在,如果有一个模式,其中键包含“x_selected”,那么我想返回整个散列,除了x键。因此,在本例中,我想返回除“潜在客户来源”之外的所有内容: 我的尝试似乎奏效了: h = { "cell_number" => 12345

我有一个如下所示的散列:

{ "cell_number" => 1234567,  "lead source" => [ "referrel", "web", "ad" ], "lead source_selected" => "web" }
现在,如果有一个模式,其中键包含“x_selected”,那么我想返回整个散列,除了x键。因此,在本例中,我想返回除“潜在客户来源”之外的所有内容:

我的尝试似乎奏效了:

 h = { "cell_number" => 1234567,  "lead source" => [ "referrel", "web", "ad" ], "lead source_selected" => "web" }
 h.collect do |k,v|
  if k =~ /(.+)_selected$/
    h.delete( $1 )
  end
 end
 => [nil, nil, ["referrel", "web", "ad"]] 
 > h
 => {"cell_number"=>1234567, "lead source_selected"=>"web"} 
但是有没有比ruby更适合的方法呢?

我认为哈希方法可以满足您的需要。 下面是一个示例,后面是输出(我可能弄错了模式,但您可以在这里看到它是如何工作的):

这是输出

the original hash
{"cell_number"=>1234567, "lead source"=>["referrel", "web", "ad"], "lead source_selected"=>"web"}
the element rejected by key (exact match)
{"cell_number"=>1234567, "lead source_selected"=>"web"}
same result using regular expression
{"cell_number"=>1234567, "lead source_selected"=>"web"}
the hash is unaffected...
{"cell_number"=>1234567, "lead source"=>["referrel", "web", "ad"], "lead source_selected"=>"web"}
... unless reject! is used instead of reject ...
{"cell_number"=>1234567, "lead source_selected"=>"web"}
编辑:添加对注释的响应:

啊,我明白了。。。变量可以通过正则表达式中的插值来使用。 它们可以包含表达式的部分或全部。例如:

phrase="lead source"
p myhash.reject{|k, v| k =~ /^#{phrase}$/}

pattern="^lead source$"
p myhash.reject{|k, v| k =~ /#{pattern}/}

希望我能理解这一点,这会有所帮助。

一个简单的解决方案:

h = { "cell_number" => 1234567,
      "lead source" => [ "referrel", "web", "ad" ],
      "lead source_selected" => "web" }

bad_keys = h.each_with_object([]) do |(k,_),a|
  prefix = k[/(.+)(?=_selected$)/]
  a << prefix if prefix
end
  #=> ["lead source"]
h.reject { |k,_| bad_keys.include?(k) }
  #=> {"cell_number"=>1234567, "lead source_selected"=>"web"} 
h={“单元号”=>1234567,
“lead source”=>[“referrel”、“web”、“ad”],
“lead source_selected”=>“web”}
坏的_键=h。每个_与_对象([])do |(k,u),a|
前缀=k[/(.+)(?=_选定$)/]
a[“铅源”]
h、 拒绝{k,{坏的}键。包括?(k)}
#=>{“单元号”=>1234567,“选定的主要来源”=>“网络”}

请注意,此选项使用(非)<正则表达式中的code>(?=_selected$)是一个正向前瞻
h
没有变异。

如果有一个键
'X_selected'
那么你想从散列中删除
'X'
,对吗?在你的例子中,你是硬编码“lead source”,但我不知道键的实际名称。我只知道,如果散列还包括一个x_selected,则必须删除一个键x,其中x可以是任何单词。(删除此回复,并将其添加到我以前的答案中以进行格式设置。)除了@Donato的评论之外,问题的中心点是确定要删除哪些键/值对(如果有),这必须在代码中完成,不是通过目视检查。@Donato,如果没有抓住要点,请告诉我,我将删除它。我只是在此处添加此链接,因为这有助于我了解何时将每个_与_对象一起使用,并减少(注入):
phrase="lead source"
p myhash.reject{|k, v| k =~ /^#{phrase}$/}

pattern="^lead source$"
p myhash.reject{|k, v| k =~ /#{pattern}/}
h = { "cell_number" => 1234567,
      "lead source" => [ "referrel", "web", "ad" ],
      "lead source_selected" => "web" }

bad_keys = h.each_with_object([]) do |(k,_),a|
  prefix = k[/(.+)(?=_selected$)/]
  a << prefix if prefix
end
  #=> ["lead source"]
h.reject { |k,_| bad_keys.include?(k) }
  #=> {"cell_number"=>1234567, "lead source_selected"=>"web"}