如何在二维哈希中找到元素的索引



我有一个包含名称和日期的2D数组:

name_date_array = [[John Doe, 8/9/14], [Jane Smith, 9/4/14], [Mary Jane, 6/5/14],
[John Doe, 5/2/14]]

(我正在重写它,因为它不清楚)我有两个变量:patient_namecollection_date。我正在尝试查找包含patient_name和小于"collection_date"的日期的子数组的索引。以下是我从falstru:得到的

patient_name = browser.find_element(:xpath => ".//*[@id='dialog-modal-cancel-hl7-preview']/table/tbody/tr[2]/td[1]").text
collected_date = browser.find_element(:xpath => ".//*[@id='dialog-modal-cancel-hl7-preview']/table/tbody/tr[2]/td[4]").text
mo, da, yr = collected_date.split('/').map(&:to_i)
cd = [yr, mo, da]
name_admit_array.index { |name, date|
    m, d, y = date.split('/').map(&:to_i)
    dt = [y, m, d]
    name == patient_name and (dt <=> cd)<0
}

这很好,但我重写这篇文章的原因(除了为了面子,因为它以前写得很糟糕)是因为我还有另一个问题。collection_date是为特定客户(patient_name)采集实验室样本的日期。每个子阵列都包含一个患者的姓名和入院日期。如果患者不止一次是患者,则可以有多个名称相同但入院日期不同的条目。

我需要找到包含paitient_name并包含与collection_date相关联的入院日期的子阵列的索引。这意味着索引的子阵列需要具有患者的姓名和在收集日期之前的入院日期,但如果有多个条目的入院日期在收集日期以前,则也需要最接近收集日期。我希望这是有道理的。

例如,如果采集日期是2014年9月3日,我需要返回子数组[John Doe, 8/9/14]的索引,而不是[John Doe, 5/2/14],因为第一个包含与该采集相关的入院日期(从他那里采集实验室的停留时间)。显然,仅仅要求collection_date大于入院日期dt是不够的。

您可以将Array#index与块一起使用。它将返回块返回true:的第一个项目的索引

name_date_array = [
  ['John Doe', '8/9/14'],
  ['Jane Smith', '9/4/14'],
  ['Mary Jane', '6/5/14'],
  ['John Doe', '5/2/14']
]
name_date_array.index { |name, date|
  m, d, y = date.split('/').map(&:to_i)
  dt = [y, m, d]
  name == 'John Doe' and (dt <=> [14, 8, 9]) < 0
}
# => 3

如果您想要获得多个索引(Enumerable#each_with_indexEnumerable#select):

name_date_array.each_with_index.select { |(name, date), i|
  m, d, y = date.split('/').map(&:to_i)
  dt = [y, m, d]
  name == 'John Doe' and (dt <=> [14, 8, 9]) < 0
}.map { |x, i| i }
# => [3]

最新更新