【问题标题】:Ruby / Replace value in array of hashRuby /替换哈希数组中的值
【发布时间】:2019-03-28 01:46:40
【问题描述】:

如何用 31 代替年龄?

[{"name"=>"Bob"}, {"age"=>"30"}]

【问题讨论】:

  • 如果 Bob 是 30,属性应该在 same 散列中,因为它们代表同一个人:[{"name"=>"Bob", "age"=>"30"}]

标签: ruby


【解决方案1】:

另一种方式,使用查找

1.9.3p194 :007 > array1 = [{"name"=>"Bob"}, {"age"=>"30"}]
 => [{"name"=>"Bob"}, {"age"=>"30"}] 
1.9.3p194 :008 > hash1 = array1.find { |h| h['age'] == "30" }
 => {"age"=>"30"} 
1.9.3p194 :009 > hash1['age'] = 31
 => 31 
1.9.3p194 :010 > array1
 => [{"name"=>"Bob"}, {"age"=>31}]

【讨论】:

    【解决方案2】:

    使用地图! (将替换包含它的所有哈希中的年龄值)

    a = [{"name"=>"Bob"}, {"age"=>"30"}]
    a.map! do |h|
      h['age'] = 31 if h['age']
      h
    end
    a
    => [{"name"=>"Bob"}, {"age"=>31}]
    

    【讨论】:

      【解决方案3】:

      为什么不将数组转换成更容易、更灵活的东西呢?您的数组迫切需要成为一个值对象:

      class Person
        attr_accessor :name, :age
        def initialize arr
          arr.each { |h| h.each { |k,v| instance_variable_set("@#{k}", v) } }
        end
        def to_hash_array
          instance_variables.each_with_object([]) do |iv, arr|
            arr << {iv.to_s.sub('@','') => instance_variable_get(iv)}
          end
        end
      end
      
      def hash_array_to_person arr
        person = Person.new
        arr.each { |h| h.each { |k,v| person.send("#{k}=", v) } }
        person
      end
      
      example = [{"name"=>"Bob"}, {"age"=>"30"}]
      bob = Person.new(example)
      
      p bob
      p bob.to_hash_array
      bob.age = 31
      p bob.to_hash_array
      

      输出:

      #<Person:0x00000000fe8418 @name="Bob", @age="30">
      [{"name"=>"Bob"}, {"age"=>"30"}]
      [{"name"=>"Bob"}, {"age"=>31}]
      

      Ruby 不是 C,您可以使用比基本的原始数据类型更多的东西。

      【讨论】:

        【解决方案4】:

        由于您真正拥有的是一个哈希数组,您可以索引该数组以获取第二个哈希,然后通过传递 "age" 作为键来更新值:

        1.9.3p194 :001 > h = [{"name"=>"Bob"}, {"age"=>"30"}]
         => [{"name"=>"Bob"}, {"age"=>"30"}] 
        1.9.3p194 :002 > h[1]["age"] = 31
         => 31 
        1.9.3p194 :003 > h
         => [{"name"=>"Bob"}, {"age"=>31}] 
        

        【讨论】:

          【解决方案5】:

          这样就可以了:

          [{"name"=>"Bob"}, {"age"=>"30"}][1]["age"] = 31
          

          【讨论】:

            猜你喜欢
            • 2014-11-06
            • 2013-07-21
            • 1970-01-01
            • 2010-12-11
            • 2014-07-25
            • 1970-01-01
            • 2013-02-13
            • 2011-12-14
            • 2016-03-07
            相关资源
            最近更新 更多