【问题标题】:How to append values to a key in ruby hashtag如何将值附加到 ruby​​ 主题标签中的键
【发布时间】:2015-09-23 02:34:36
【问题描述】:

我想将多个值附加到 ruby​​ 哈希中的同一个键。一直在用

    tags.merge!({'xyz': 'abc'})

向哈希添加新标签,但是一直无法找到将多个值添加到同一个键的方法。

例如:

  tags = {'square': 'blue', 'rectangle': 'green, 'circle': 'yellow'}

我想为形状添加另一种颜色,使其看起来像:

  tags = {'square': 'blue', 'rectangle': 'green, 'circle': ['yellow','red']}

我该怎么做?

【问题讨论】:

  • 许多可能的解决方案。如果您 can 有多个条目,那么 always 将数组作为值可能是一个更好的主意。您可以通过将默认值设置为数组并将新值推送到其上来自动执行此操作。
  • 谢谢戴夫。但是,没有内置函数可用于为键附加值吗?
  • 不,没有内置函数可以做到这一点。哈希键只能引用一个值。这就是为什么总是从每个值的数组开始可能会有所帮助,如果值尚未设置,则初始化一个空数组。

标签: ruby hash


【解决方案1】:

您可以将一个块传递给merge,然后对合并到重复键中的值做您想做的事情:

tags = {square: 'blue', rectangle: 'green', circle: 'yellow'}
tags.merge!({ circle: 'red', square: 'red' }) do |key, oldval, newval|
  if key == :circle
    # Change to array and add the new value
    (oldval.is_a?(Array) ? oldval : [oldval]) << newval
  else
    # Acts like default
    newval
  end
end

# => {:square=>"red", :rectangle=>"green", :circle=>["yellow", "red"]}

但如果:circle 是一个数组,即使只有一个元素也会更好。

【讨论】:

    【解决方案2】:

    谢谢各位!我为所有标记值初始化一个空数组,并使用三元运算符将值附加到特定键,如下所示:

         tags.has_key?(:circle) ? (tags[:'circle'] << "#{row['shape']}") : (tags[:'circle'] = ["#{row['shape']}"])
    

    我使用的是 CSV 文件中的数据,因此它将写入特定行中的值。

    并使用 .uniq 删除重复项。

    【讨论】:

    • tags[:'circle'] &lt;&lt; [row['shape'] ]
    【解决方案3】:

    你可以这样做:

    tags = {'square' => 'blue', 'rectangle' => 'green', 'circle' => 'yellow'}
    
    def add(hash, key, value)
        if hash[key]
            hash[key] = ([hash[key]] << value).flatten
        else
            hash[key] = value   
        end
        hash
    end
    
    p add(tags, 'circle', 'red')
    #=> {"square"=>"blue", "rectangle"=>"green", "circle"=>["yellow", "red"]}
    
    p add(tags, 'circle', 'violet')
    #=> {"square"=>"blue", "rectangle"=>"green", "circle"=>["yellow", "red", "violet"]}
    

    更新: 如果您的哈希中的value 将始终是一个数组,那么可以执行以下操作

    tags[key] = [[tags[key]] << value].flatten.compact
    

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 2018-04-12
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多