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

时间:2014-09-20 03:04:56

标签: ruby arrays indexing multidimensional-array

我有一个包含姓名和日期的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'的日期。以下是我对于falsetru的看法:

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关联的录取日期。这意味着索引的子阵列需要具有患者的姓名和在收集日期之前的入院日期,但如果在收集日期之前有多个入口日期的条目,则最接近收集日期。我希望这是有道理的。

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

1 个答案:

答案 0 :(得分:1)

您可以将Array#index与块一起使用。它将返回块返回{h}的第一个项的索引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]