0

我正在尝试检查包含一个或多个匹配字符串的字符串数组。

目前我正在通过使用 if 语句来做到这一点 - 不好,但它有效 - 但是现在我正在寻找一种更像 Ruby 的方式来做到这一点。

row[:datapoints].each do |data|             
    if data[:direction].include? "Beusselstr"
        data[:image] = "category-1"
    end     
    if data[:direction].include? "Ostkreuz"
        data[:image] = "category-1"
    end                         
    if data[:direction].include? "Westend"
        data[:image] = "category-2"
    end
    if data[:direction].include? "1)S Gr"
        data[:image] = "category-3"             
    end
end

而不是这个,我想将匹配的字符串存储在一个数组中。为了让它更复杂一点,我实际上有不同类别的匹配术语及其自己的结果操作(请参阅 data[:image] 值的类别特定分配)。

category_1_keywords = ["Beusselstr","Ostkreuz"]
category_2_keywords = ["nefeld Bhf","Greifswalder","Westend"]
category_3_keywords = ["1)S Gr"]

imagecategories = {:category_1 => category_1_keywords,:category_2 => category_2_keywords,:category_3 => category_3_keywords}

使用这样的匹配数组(imagecategories )过滤数组(row[:datapoints])会是什么样子?

4

2 回答 2

1

您可能想要使用数组交集运算符&并检查它是否为空。

if (data[:direction] & category_1_keywords).any?
  data[:image] = "category-1"
end

4 if 连续虽然开始看起来像迭代器的时间:

keywords = {
'category_1' => ["Beusselstr","Ostkreuz"],
'category_2' => ["nefeld Bhf","Greifswalder","Westend"],
'category_3' => ["1)S Gr"]
}

data[:image] = keywords.find{|k,v| (data[:direction] & v).any?}[0]
于 2013-05-15T08:32:59.313 回答
0

假设这data[:direction]是一个字符串,您可以通过以下方式找到类别:

data[:image], _ = imagecategories.find { |category, keywords|
  keywords.any? { |keyword|
    data[:direction].include?(keyword)
  }
}

在纯文本中:找到第一个类别关键字对 ( ),其中包含字符串包含的imagecategories.find任何关键字 ( keywords.any?) 。data[:direction]

于 2013-05-15T09:01:12.503 回答