我想重命名一个哈希键。这一点:
myhash[preferred_name] = myhash.delete old_name 在哈希的最后一个索引处插入新的键值对。有没有一种方法可以在不添加新散列的情况下重命名散列?
发布于 2018-12-18 00:58:11
您可以使用transform_keys!
h = { foo: 1, bar: 2, baz: 3 }
h.transform_keys! { |k| k == :bar ? :qux : k }
#=> {:foo=>1, :qux=>2, :baz=>3}只需确保新的键还没有出现在散列中。
发布于 2018-12-18 01:40:39
我赞同@Stefen的回答,但条件是,当Hash#transform_keys!首次亮相时,没有必要支持Ruby2.5之前的版本。如果必须支持更早的版本,这里有一种方法(不创建新的散列),这是OP提到的方法的扩展。
h = { foo: 1, bar: 2, baz: 3 }
h.keys.each { |k| h[k == :bar ? :qux : k] = h.delete(k) }
#=> [:foo, :bar, :baz]
h #=> {:foo=>1, :qux=>2, :baz=>3}请注意,不能使用枚举数Hash#each_key和Hash#each,因为键在迭代期间被删除。
下面是另一个选择。
keys = h.keys
keys[keys.index(:bar)] = :qux
h.replace(keys.zip(h.values).to_h)
#=> {:foo=>1, :qux=>2, :baz=>3}发布于 2018-12-18 12:25:45
myhash.to_a.each { |a| a[0] = preferred_name if a[0] == old_name }.to_h或者:
h.map { |k, v| [k == old_name ? preferred_name : k, v] }.to_h不幸的是,这两种解决方案都将扫描整个结构-即使在找到匹配之后-因此,如果您的散列有许多条目,您可能会选择其他选项之一。
https://stackoverflow.com/questions/53819509
复制相似问题