首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重命名散列键,但保持顺序(不执行插入新操作)

重命名散列键,但保持顺序(不执行插入新操作)
EN

Stack Overflow用户
提问于 2018-12-18 00:41:26
回答 3查看 88关注 0票数 1

我想重命名一个哈希键。这一点:

代码语言:javascript
运行
复制
myhash[preferred_name] = myhash.delete old_name 

在哈希的最后一个索引处插入新的键值对。有没有一种方法可以在不添加新散列的情况下重命名散列?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-18 00:58:11

您可以使用transform_keys!

代码语言:javascript
运行
复制
h = { foo: 1, bar: 2, baz: 3 }

h.transform_keys! { |k| k == :bar ? :qux : k }
#=> {:foo=>1, :qux=>2, :baz=>3}

只需确保新的键还没有出现在散列中。

票数 3
EN

Stack Overflow用户

发布于 2018-12-18 01:40:39

我赞同@Stefen的回答,但条件是,当Hash#transform_keys!首次亮相时,没有必要支持Ruby2.5之前的版本。如果必须支持更早的版本,这里有一种方法(不创建新的散列),这是OP提到的方法的扩展。

代码语言:javascript
运行
复制
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_keyHash#each,因为键在迭代期间被删除。

下面是另一个选择。

代码语言:javascript
运行
复制
keys = h.keys
keys[keys.index(:bar)] = :qux
h.replace(keys.zip(h.values).to_h)
  #=> {:foo=>1, :qux=>2, :baz=>3}
票数 1
EN

Stack Overflow用户

发布于 2018-12-18 12:25:45

代码语言:javascript
运行
复制
myhash.to_a.each { |a| a[0] = preferred_name if a[0] == old_name }.to_h

或者:

代码语言:javascript
运行
复制
h.map { |k, v| [k == old_name ? preferred_name : k, v] }.to_h

不幸的是,这两种解决方案都将扫描整个结构-即使在找到匹配之后-因此,如果您的散列有许多条目,您可能会选择其他选项之一。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53819509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档