根据另一个数组中的值排除/包含一个数组中的项目

时间:2015-08-04 16:54:19

标签: arrays ruby

我有两个数组,一个包含哈希,另一个包含整数。他们看起来像这样(样本):

mainArray[0] = {"ID" => 23, "NAME" => "SALLY"}
mainArray[1] = {"ID" => 34, "NAME" => "BILL"}

idArray[0] = 432
idArray[1] = 34

我想过滤mainArray,以便只有ID值在idArray中的条目才会被删除。我该怎么做才能做到最好?如果有帮助,我不介意制作新阵列。

3 个答案:

答案 0 :(得分:2)

你可以这样做:

mainArray.find_all { |a| idArray.include?(a["ID"]) }
# => [{"ID"=>34, "NAME"=>"BILL"}]

答案 1 :(得分:1)

如果散列中的ID值始终是唯一的,则可以执行此操作,这将非常快速地运行:

main_array = [
  {"ID" => 23, "NAME" => "SALLY"},
  {"ID" => 34, "NAME" => "BILL"}
]

id_array = [432, 34]

main_hash = main_array.map{ |h| [h['ID'], h['NAME']] }.to_h
main_hash.values_at(*id_array).compact # => ["BILL"]

我们的想法是将主数组转换为哈希,使用ID字段作为键,名称作为值。散列查找比使用数组更快 更快,尤其是当你必须查看每个数组时。

您的编码风格对于Ruby来说不是惯用语。我们使用snake_case for_variables_and_methods_because_it_is_easier toReadThanCamelCase。我们将CamelCase用于类和模块。我们使用UPPERCASE作为常量。遵循这些惯例,否则如果您进行专业编程,您将会感到非常悲伤。有关更多信息,请访问:

答案 2 :(得分:1)

h = mainArray.to_enum.with_object({}){|e, h| h[e["ID"]] = e["NAME"]}
idArray.map{|e| h[e]}.compact