【问题标题】:Better way to replace keys of a hash替换哈希键的更好方法
【发布时间】:2013-12-18 11:04:22
【问题描述】:

我想使用规范化函数规范化 Hash 的键,以便此哈希

{"aType" => 1, "b_Type" => 2}

将转换为

{:atype => 1, :btype => 2}

在这里,规范化函数从键中删除下划线,将它们小写,并使其成为符号。

我使用map 编写了以下内容(假设normalize 是一种规范化方法):

params = params.map {|k,v| {normalize(k) => v}}.inject(:merge)

有没有更好的方法来做到这一点?

此问题与“How to replace all hash keys having a '.'?”问题有关。我想知道执行此操作的最佳(不那么冗长或更快)方法。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    我会这样做

    Hash[h.map {|k,v| [normalize(k), v] }]
    

    【讨论】:

    • 对,看起来更快(从性能的角度来看,我不喜欢inject(:merge)。让我等待其他答案:)
    【解决方案2】:

    Rails 是这样做的(在这种情况下,它们扩展 Hash 以生成所有键字符串,但您可以轻松地将方法放在其他地方)。

    def stringify_keys!
      keys.each do |key|
        self[key.to_s] = delete(key)
      end
      self
    end
    

    尽管所有这些方法都是合理的,并且对于大多数用途而言可能没有实质性的可读性或性能差异。

    【讨论】:

    • 这听起来很棒,如果我在不同的位置使用相同的并且猴子补丁Hash 是合理的。很好的答案。不幸的是,对于我目前的项目,我需要避免猴子补丁并且需要“就地”或单线解决方案,所以我不能使用这种方式:
    • 很清楚如何在没有猴子补丁的情况下使用此方法。只需让它接受一个参数并使用它代替self(并在其上调用delete)。但不,它不是单线。
    • 谢谢。代码本身不是问题。在哪里放置猴子补丁代码是个问题,尤其是我只需要在一个地方使用这个功能。
    【解决方案3】:

    如果您在 Rails 应用程序中,或者想要引入 ActiveSupport,您可以使用 ActiveSupport::HashWithIndifferentAccess,它允许您使用 'key':key 从哈希中设置或获取值

    【讨论】:

    • 谢谢。我正在开发一个 Rails 应用程序。但是我需要在不同的位置(不仅是哈希本身)相同的键,所以我不能使用这个方案。无论如何,谢谢。
    猜你喜欢
    • 2014-08-27
    • 2010-12-02
    • 1970-01-01
    • 2015-07-01
    • 2019-03-22
    • 1970-01-01
    • 2013-12-13
    • 2015-04-29
    相关资源
    最近更新 更多