删除数组中重复的元素,这些元素是哈希值及其对应的ID

C. *_*Yee 0 ruby algorithm hash

我有一个哈希值,它是一个数组。如何以最有效的方式删除数组中的重复元素和相应的ID?

这是我的哈希示例

hash = { 
  "id" => "sjfdkjfd",
  "name" => "Field Name",
  "type" => "field",
  "options" => ["Language", "Question", "Question", "Answer", "Answer"],
  "option_ids" => ["12345", "23456", "34567", "45678", "56789"]
}
Run Code Online (Sandbox Code Playgroud)

我的主意是这样的

hash["options"].each_with_index { |value, index |
  h = {}
  if h.key?(value)
    delete(value)
    delete hash["option_ids"].delete_at(index)
  else 
    h[value] = index
  end
}
Run Code Online (Sandbox Code Playgroud)

结果应该是

hash = { 
  "id" => "sjfdkjfd",
  "name" => "Field Name",
  "type" => "field",
  "options" => ["Language", "Question", "Answer"],
  "option_ids" => ["12345", "23456", "45678"]
}
Run Code Online (Sandbox Code Playgroud)

我知道我必须考虑到,当我删除options和option_ids的值时,这些值的索引将会改变。但不确定如何做到这一点

iGi*_*ian 5

我的第一个想法是压缩值并调​​用uniq,然后考虑一种返回初始形式的方法:

h['options'].zip(h['option_ids']).uniq(&:first).transpose
#=> [["Language", "Question", "Answer"], ["12345", "23456", "45678"]]
Run Code Online (Sandbox Code Playgroud)


然后,通过并行分配:

h['options'], h['option_ids'] = h['options'].zip(h['option_ids']).uniq(&:first).transpose

h #=> {"id"=>"sjfdkjfd", "name"=>"Field Name", "type"=>"field", "options"=>["Language", "Question", "Answer"], "option_ids"=>["12345", "23456", "45678"]}
Run Code Online (Sandbox Code Playgroud)

这些步骤是:

h['options'].zip(h['option_ids'])
#=> [["Language", "12345"], ["Question", "23456"], ["Question", "34567"], ["Answer", "45678"], ["Answer", "56789"]]

h['options'].zip(h['option_ids']).uniq(&:first)
#=> [["Language", "12345"], ["Question", "23456"], ["Answer", "45678"]]
Run Code Online (Sandbox Code Playgroud)