簡體   English   中英

如何從 ruby 上的哈希數組中提取 id?

[英]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
  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(',').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包含許多元素(散列)並且對於每個元素hh['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::newSet#<<Set#to_a

請注意,此處返回的數組包含與之前返回的數組相同的元素,但順序不同。 我認為這不是進口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM