有条件地从哈希数组中提取哈希



来自以下哈希数组:

x = [
  {"creationDate"=>123456,"createdBy"=>"test_user1"},
  {"creationDate"=>123459,"createdBy"=>"test_user1"},
  {"creationDate"=>123458,"createdBy"=>"test_user1"},
  {"creationDate"=>123454,"createdBy"=>"test_user2"},
  {"creationDate"=>123452,"createdBy"=>"test_user2"},
  {"creationDate"=>123451,"createdBy"=>"test_user2"}
]

我试图找到最大的:creationDate值,其中:createdBy值是"test_user1"。我做到了:

x.map {|a| a['creationDate'] if a['createdBy'] == 'test_user1'}
# => [123456,123459,123458,nil,nil,nil]

我想去掉nil,这样我就可以将max应用于那个数组。如何修改上面的代码?

您想在这里做的是:

x.select { |record| record[:createdBy] == 'test_user1' }.map { |record| record[:creationDate] }.max
  # => 123459

通常,要从数组中删除nils,只需调用Array#compact:

[1, nil, nil, 2, 'foo', nil].compact # => [1, 2, "foo"]

这与您计划在python中执行的操作非常接近:

x.select { |n| n[:createdBy] == "test_user1" }.max_by { |n| n[:creationDate] }

第一个操作选择由"test_user1"创建的记录,而第二个操作根据creationDate 获得结果数组的最大值

我猜是这样的:

x.delete_if {|x| x == nil}

这是映射减少函数(如inject(的一个很好的候选者。

x = [{"creationDate" => 123456,"createdBy" => "test_user1"},
     {"creationDate" => 123459,"createdBy" => "test_user1"},
     {"creationDate" => 123458,"createdBy" => "test_user1"},
     {"creationDate" => 123454,"createdBy" => "test_user2"},
     {"creationDate" => 123452,"createdBy" => "test_user2"},
     {"creationDate" => 123451,"createdBy" => "test_user2"}]
x.inject(nil) do |result, item|
  if item["createdBy"] == "test_user1" && (result.nil? or item["creationDate"] > result)
    item["creationDate"]
  else
    result
  end
end

以下是inject的一个可能实现。该块将迭代集合中的每个项,并始终保持最高值。

x.min_by{|h| [h[:createdBy], -h[:creationDate]]}[:creationDate]
# => 123459

[123456, 123459, 123458, nil, nil, nil].compact
# => [123456, 123459, 123458]

这是有效的:

x.map {|a| a['creationDate'] if a['createdBy'] == 'test_user1'}.compact.max
# => 123459

最新更新