如何从红宝石上的哈希数组中提取ID?

给出:

data = [
  {"id"=>nil,"votable_id"=>1150,"user_ids"=>"1120,1119,1118,1117,1116,1115,1114,1113,1112,1111,1110,1109,1108,1107"},{"id"=>nil,"votable_id"=>1151,1107"}
]

我希望返回字符串g["user_ids"]中整数的所有唯一表示形式的数组,该数组表示为g元素的所有散列data;即

["1120","1119","1118","1117","1116","1115","1114","1113","1112","1111","1110","1109","1108","1107"]
mdd000000 回答:如何从红宝石上的哈希数组中提取ID?

要获取唯一ID:

unique_ids = data.flat_map { |d| d['user_ids'].split(',') }.uniq
  1. Enumerable#flat_map遍历数组并连接 代码块中提供的结果。
  2. String#split用分隔符分隔字符串 放入数组。
  3. Array#uniq删除重复项。
,

如果您使用Rails,请尝试以下操作:

data.pluck('user_ids').join(',').split(',').uniq

如果您不使用Rails:

data.map{ |d| d.dig('user_ids') }.join(',').uniq

结果:

#=> [
#     "1120","1119","1118","1117","1116","1115","1114",#     "1113","1112","1111","1110","1109","1108","1107"
#   ]
,
data.reduce('') { |s,h| s + h['user_ids'] + ',' }.scan(/\d+/).uniq
  #=> ["1120","1113",#    "1112","1107"] 

步骤如下。

str = data.reduce('') { |s,' }
  => "1120,1119,...1107,1120," 
arr = str.scan(/\d+/)
  #=> ["1120","1107","1120",#    "1118",#    "1110","1107"]
arr.uniq
  #=> ["1120","1107"]

此方法的问题在于,如果arr包含许多元素(哈希),并且对于每个元素datah包含以下内容,则中间数组h['user_ids'].split(',')可能会很大许多要素。解决该问题的一种方法是构建一个集合,该集合当然包含唯一的元素,然后将该集合最后转换为数组。

require 'set'

data.each_with_object(Set.new) { |h,set|
  h["user_ids"].split(',').each { |s| set << s } }.to_a
  #=> ["1120",#    "1113","1107"]

请参见Set::newSet#<<Set#to_a

请注意,此处返回的数组包含与先前返回的数组相同的元素,但顺序不同。我认为那不重要。

本文链接:https://www.f2er.com/3151987.html

大家都在问