要获取唯一ID:
unique_ids = data.flat_map { |d| d['user_ids'].split(',') }.uniq
-
Enumerable#flat_map
遍历数组并连接
代码块中提供的结果。
-
String#split
用分隔符分隔字符串
放入数组。
-
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
包含许多元素(哈希),并且对于每个元素data
,h
包含以下内容,则中间数组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::new,Set#<<和Set#to_a。
请注意,此处返回的数组包含与先前返回的数组相同的元素,但顺序不同。我认为那不重要。
本文链接:https://www.f2er.com/3151987.html