【问题标题】:Ruby array to hash: each element the key and derive value from it要散列的 Ruby 数组:每个元素都是键并从中派生值
【发布时间】:2012-03-15 01:49:26
【问题描述】:

我有一个字符串数组,想用它做一个散列。数组的每个元素都是键,我想从该键计算值。有没有 Ruby 方法可以做到这一点?

例如:

['a','b'] 转换为{'a'=>'A','b'=>'B'}

【问题讨论】:

  • 字符串是唯一的吗?如果他们不是呢?你想要一个例外吗?
  • 是的,它们将是独一无二的。如果他们不是,我会在那之前做一个 uniq。

标签: ruby


【解决方案1】:

你可以:

a = ['a', 'b']
Hash[a.map {|v| [v,v.upcase]}]

【讨论】:

  • 这当然有效...但我认为它不是有效的...在这种情况下您要迭代两次。长度为 2 的数组当然不是问题,但仍然值得注意。
【解决方案2】:
%w{a b c}.reduce({}){|a,v| a[v] = v.upcase; a}

【讨论】:

  • 我喜欢你的解决方案!非常光滑!
【解决方案3】:

Ruby 的 each_with_object 方法是做你想做的事的好方法

['a', 'b'].each_with_object({}) { |k, h| h[k] = k.upcase }

【讨论】:

    【解决方案4】:

    无论您以哪种方式查看它,都需要迭代初始数组。这是另一种方式:

    a = ['a', 'b', 'c']
    h = Hash[a.collect {|v| [v, v.upcase]}]
    #=> {"a"=>"A", "b"=>"B", "c"=>"C"}
    

    【讨论】:

      【解决方案5】:

      这是一个天真而简单的解决方案,将当前字符转换为用作键的符号。只是为了好玩,它把价值资本化了。 :)

      h = Hash.new
      ['a', 'b'].each {|a| h[a.to_sym] = a.upcase}
      puts h
      
      # => {:a=>"A", :b=>"B"}
      

      【讨论】:

        【解决方案6】:

        这是另一种方式:

        a.zip(a.map(&:upcase)).to_h
        
        #=>{"a"=>"A", "b"=>"B"}
        

        【讨论】:

          【解决方案7】:

          不确定这是否是真正的 Ruby 方式,但应该足够接近:

          hash = {}
          ['a', 'b'].each do |x|
            hash[x] = x.upcase
          end
          
          p hash  # prints {"a"=>"A", "b"=>"B"}
          

          作为一个函数,我们会有这样的:

          def theFunk(array)
            hash = {}
            array.each do |x|
              hash[x] = x.upcase
            end
            hash
          end
          
          
          p theFunk ['a', 'b', 'c']  # prints {"a"=>"A", "b"=>"B", "c"=>"C"}
          

          【讨论】:

            【解决方案8】:

            从 Rails 6.x 开始,您可以使用Enumerable#index_with

            irb(main):002:0> ['a', 'b'].index_with {|s| s.upcase}
            => {"a"=>"A", "b"=>"B"}
            

            【讨论】:

              【解决方案9】:

              .map.to_h

              [ 'a', 'b' ].map{ |element| [ element, element.upcase ] }.to_h
              #=> {"a"=>"A", "b"=>"B"}
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-04-24
                • 2017-05-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-02-03
                • 2014-11-24
                • 2020-05-22
                相关资源
                最近更新 更多