【问题标题】:Update one array of hash based on key value of other array of hash根据其他哈希数组的键值更新一个哈希数组
【发布时间】:2019-05-01 12:53:45
【问题描述】:

我有以下两个哈希数组。我正在尝试从医生数组散列中删除记录,其医生_患者_id 不存在于患者_和_医生散列数组的医生_患者_id 数组中。

doctor = [
  { :doctor_patient_id=>"abc",
    :doctor_id=>"d1"
  },
  { :doctor_patient_id=>"def",
    :doctor_id=>"d2"
  },
  { :doctor_patient_id=>"ghi",
    :doctor_id=>"d3"
  }
]

patient_and_doctor = [
  { :patient_id=>"11e8f37477ab7028a66b210b9699def9",
    :doctor_patient_id=>[ "def", "zkj", "cps" ]
  },
  { :patient_id=>"11e8f37481fabfe68630f5da2e22dceb",
    :doctor_patient_id=>[ "uio", "ghi", "jkk" ]
  }
]

预期输出是:

doctor = [
      { :doctor_patient_id=>"def",
        :doctor_id=>”d2”
      },
      { :doctor_patient_id=>"ghi",
        :doctor_id=>”d3”
      }
    ]

我试图做类似下面的事情但没有运气,

patient_and_doctor.each do |dp|
  data = doctor.map {|d| d[:doctor_patient_id].include? 
   dp[:doctor_patient_id] }
end

我怎样才能做到这一点?

【问题讨论】:

  • 在医生和患者之间建立关系似乎更好?

标签: ruby-on-rails ruby


【解决方案1】:
valid_ids = patient_and_doctor.flat_map { |h| h[:doctor_patient_id] }
# => ["def", "zkj", "cps", "uio", "ghi", "jkk"]

doctor.select { |h| valid_ids.include? h[:doctor_patient_id] }
# => [{:doctor_patient_id=>"def", :doctor_id=>"d2"},
#     {:doctor_patient_id=>"ghi", :doctor_id=>"d3"}]

如果您希望改变您的 doctor 数组而不是返回一个新数组,请使用 select! 而不是 select

【讨论】:

  • 根据数组大小,将valid_ids 包装到一个Set 中可能是值得的。这消除了重复并使基于值的查找更快(数组设计为通过索引快速查找)。只需在两条当前行之间添加行valid_ids = Set.new(valid_ids)。这是一个简单的benchmark。请记住,这确实会产生一些开销,并且对于小型集合来说是不值得的。
  • 公平点,虽然也需要require 'set',但可以在第一行末尾调用.to_set
  • 是的,但是在 Ruby on Rails 环境中运行时不需要 require 'set',因为框架包含来自 std-lib 的大部分(如果不是全部)内容。
【解决方案2】:

以下可以获得所需的答案,

doctor.select { |x|  patient_and_doctor.map { |x| x[:doctor_patient_id] }.flatten.include?(x[:doctor_patient_id]) }

【讨论】:

    猜你喜欢
    • 2013-03-22
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多