0

我有一种方法可以遍历哈希,.map以创建另一个哈希作为结果。

def assigned_task_list
  assigned_tasks.map do |issue|
    {
      key: issue.key,
      desired_time_to_resolution: issue.customfield_14777.dig('ongoingCycle', 'remainingTime', 'friendly'),
      time_to_resolution: issue.customfield_10031.dig('ongoingCycle', 'remainingTime', 'friendly'),
      name: issue.name
    }
  end
end

如何将 if 块放入此哈希中以决定放在那里desired_time_to_resolution:time_to_resolution

我的意思是如果像这样阻止:

if issue.customfield_14777.nil?
  desired_time_to_resolution: issue.customfield_14777.dig('ongoingCycle', 'remainingTime', 'friendly')
else
  time_to_resolution: issue.customfield_10031.dig('ongoingCycle', 'remainingTime', 'friendly')
end
4

2 回答 2

1

您不能在哈希执行此操作,但您可以使用它Hash#merge来更新哈希。

def assigned_task_list
  assigned_tasks.map do |issue|
    {
      key: issue.key,
      name: issue.name
    }.merge(
      if issue.customfield_14777.present?
        {desired_time_to_resolution: ...}
      else
        {time_to_resolution: ...}
      end
    )
  end
end
于 2020-02-13T15:28:23.013 回答
0

据我了解,您的问题类似于以下问题。

class C
  attr_reader :name, :is_k1, :k1, :k2, :v
  def initialize(name, is_k1, k1, k2, v)
    @name, @is_k1, @k1, @k2, @v = name, is_k1, k1, k2, v
  end
end

c1 = C.new("Bob", true, :a, :b, 1)
  #=> #<C:0x0000583742602eb8 @name="Bob", @is_k1=true, @k1=:a,
  #     @k2=:b, @v=1> 
c2 = C.new("Lois", false, :c, :d, 2)
  #=> #<C:0x0000583742612ac0 @name="Lois", @is_k1=false, @k1=:c,
  #     @k2=:d, @v=2> 

我们希望将每个实例ic1c2)映射到哈希中:

{ name: i.name, i.k1: i.v }

如果i.is_k1 #=> true并进入哈希

{ name: i.name, i.k2: i.v }

如果i.is_k1 #=> false. 我们可以简单地写:

[c1, c2].map { |i| { name: i.name, (i.is_k1 ? i.k1 : i.k2)=>i.v } }
  #=> [{:name=>"Bob", :a=>1}, {:name=>"Lois", :d=>2}]
于 2020-02-13T21:06:41.400 回答