来自以下哈希数组:
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
通常,要从数组中删除nil
s,只需调用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