![](/img/trans.png)
[英]How to add and merge values from different array of hashes in ruby on rails
[英]How to pull ids from array of hashes on ruby?
鑒於:
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, "user_ids"=>"1120,1119,1118,1117,1116,1115,1114,1113,1112,1111,1110,1109,1108,1107"}
]
我希望返回字符串g["user_ids"]
中整數的所有唯一表示的數組,接管作為data
元素的所有哈希g
; 即,
["1120", "1119", "1118", "1117", "1116", "1115", "1114",
"1113", "1112", "1111", "1110", "1109", "1108", "1107"]
要獲取唯一 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(',').split(',').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", "1119", "1118", "1117", "1116", "1115", "1114", "1113",
# "1112", "1111", "1110", "1109", "1108", "1107"]
步驟如下。
str = data.reduce('') { |s,h| s + h['user_ids'] + ',' }
=> "1120,1119,...1107,1120,1119,...1107,"
arr = str.scan(/\d+/)
#=> ["1120", "1119", "1118", "1117", "1116", "1115", "1114", "1113",
# "1112", "1111", "1110", "1109", "1108", "1107", "1120", "1119",
# "1118", "1117", "1116", "1115", "1114", "1113", "1112", "1111",
# "1110", "1109", "1108", "1107"]
arr.uniq
#=> ["1120", "1119", "1118", "1117", "1116", "1115", "1114", "1113",
# "1112", "1111", "1110", "1109", "1108", "1107"]
這種方法的一個問題是,如果data
包含許多元素(散列)並且對於每個元素h
, h['user_ids'].split(',')
包含許多元素,則中間數組arr
可能會非常大。 解決這個問題的一種方法是構建一個集合,其中當然包含唯一元素,然后在最后將該集合轉換為數組。
require 'set'
data.each_with_object(Set.new) { |h,set|
h["user_ids"].split(',').each { |s| set << s } }.to_a
#=> ["1120", "1119", "1118", "1117", "1116", "1115", "1114",
# "1113", "1112", "1111", "1110", "1109", "1108", "1107"]
請參閱Set::new 、 Set#<<和Set#to_a 。
請注意,此處返回的數組包含與之前返回的數組相同的元素,但順序不同。 我認為這不是進口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.