我有一个散列值,它是一个数组。如何以最高效的方式删除数组中重复的元素和对应的id?
这是我的哈希值的一个例子
hash = {
"id" => "sjfdkjfd",
"name" => "Field Name",
"type" => "field",
"options" => ["Language", "Question", "Question", "Answer", "Answer"],
"option_ids" => ["12345", "23456", "34567", "45678", "56789"]
}
我的想法是这样的
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
}
结果应该是
hash = {
"id" => "sjfdkjfd",
"name" => "Field Name",
"type" => "field",
"options" => ["Language", "Question", "Answer"],
"option_ids" => ["12345", "23456", "45678"]
}
我知道我必须考虑到,当我删除选项和option_id的值时,这些值的索引将发生变化。但不知道该怎么做
3条答案
按热度按时间v1l68za41#
我的第一个想法是压缩值并调用uniq,然后想办法返回到初始形式:
然后,通过并行分配:
这些是步骤:
ubby3x7f2#
我假设“重复的元素”指的是连续的相等元素(仅在
[1,2,2,1]
中有2
),而不是“重复的元素”(在前面的例子中有1
和2
)。我展示了如果第二种解释适用,代码将如何被修改(实际上是简化)。如果“重复元素”被解释为
"options"
和"option_ids"
的值仅具有上面显示的前三个元素,则计算idx
如下:请参阅EQUIPMENT #chunk_while(EQUIPMENT #slice_when可以改为)和Array#values_at。其步骤如下。
我们可以看到枚举器
e1
将生成并通过将其转换为数组传递给map
的值:继续
gfttwv5a3#
使用
Array#transpose
OP编辑后: