ruby keep_if数组与字符串的比较

adb*_*ads 2 ruby arrays

我试图比较一个字符串与一组对象.因此,当字符串值与数组中的该对象匹配时,它将保留它.

这是一个例子:

sample = [#<Model::ID:0x007fcb83ace8a0
  type_id: 6,
  parent_name: "Old Man",
  child_name: "Junior">,
 #<Model::ID:0x007fcb83abd0a0
  type_id: 6,
  parent_name: "Mary",
  child_name: "Michelle">,
 #<Model::ID:0x007fcb83abce70
  type_id: 6,
  parent_name: "Ole Bob",
  child_name: "Bobby">]

name = "Michelle"
Run Code Online (Sandbox Code Playgroud)

所以我尝试了以下方法:

sample.keep_if { |keep_ele| [keep_ele]["child_name"] == name }
Run Code Online (Sandbox Code Playgroud)

这会返回以下错误:TypeError:没有将String隐式转换为Integer

但是当我在IRB并且输出时sample[1]["child_name"]它等于"Michelle"

那么我试过:

sample.keep_if { |keep_ele| keep_ele["child_name"] == name }
Run Code Online (Sandbox Code Playgroud)

它刚刚返回一个空数组: []

关于如何运行keep_if的任何想法?

sme*_*fju 5

keep_elekeep_if块内部已经是数组中的模型对象(item).您应该使用以下比较:

sample.keep_if { |keep_ele| keep_ele["child_name"] == name }
Run Code Online (Sandbox Code Playgroud)

请查看文档页面Array#keep_if.这是类似的例子:

sample = [
  {
    "child_name" => "Mike"
  }, {
    "child_name" => "Michelle"
  }, {
    "child_name" => "Joe"
  }
]

name = "Michelle"
puts sample.keep_if { |keep_ele| keep_ele["child_name"] == name }
# => {"child_name"=>"Michelle"}
Run Code Online (Sandbox Code Playgroud)