我有一系列哈希,如:
arry = {hash1, hash2, hash3,hash4 ....hash_N}
每个哈希,
hash1 ={ "deviceId"=>"868403021230682", "osVersion"=>"6.0", "deviceOS"=>"Android",
"appVersion"=>"1.7.2", "action"=>"Enter"}
hash2 = { "deviceId"=>"868403021230682", "osVersion"=>"6.0", "deviceOS"=>"Android",
"appVersion"=>"1.7.2", "action"=>"Leave"}
因为有可能每个哈希"action"=>"Enter" or "Leave"
并不总是显示为一对,例如,对于hash3的操作,hash4,hash5可能都是“Enter” 。我的想法是只考虑两个哈希,它们可以像hash1和hash2一样,从数组中删除其他数据或将它们放入其他数组中。
所以新数组应该只包含[hash1, hash2, hash7,hash8]
,让我们说hash7和8也是一对。
我应该使用each_with_index吗?我的代码是这样的:
def get_result(doc)
result = []
doc.each_slice(2).map { |pair|
pair.each_with_index { |element, index|
if ( pair[index].has_value?([:action] => "enter") &&pair[index+1].has_value?([:action] => "Leave")
result.push(pair)
end
}
}
end
但是if
声明无效,有点混淆如何使用each_with_index
希望有人可以帮我解决
答案 0 :(得分:1)
根据您创建方法的方式,您可以这样做:
def get_result(doc)
doc.each_slice(2).to_a.map{ |ah| ah if ah[0][:action] == 'Enter' && ah[1][:action] == 'Leave'}.compact.flatten
end
<强>解释强>
变量doc
是一个哈希[hash1, hash2, ...]
数组,当我们创建doc.each_slice(2).to_a
时会返回一对哈希值[[hash1, hash2],[hash3,hash4]...]
的数组,现在当我们map
时并获得每个订单actions
的一对哈希('Enter','Leave')我们得到一个数组,其中包含像[[hash1,hash2],nil,[hash5,hash6]..]
这样的nil值。我们使用compact来删除nil
值。现在数组就像这个[[hash1,hash2],[hash5,hash6]..]
(哈希对的数组),预期的结果是哈希数组,这就是为什么我们需要flatten
,它会删除内部数组并返回一个像这样的数组[hash1, hash2, hash5, hash6 ...]
如果你需要获取已删除哈希的列表,我认为如果添加另一种方法更好。否则,您可以使get_result
方法返回两个数组。
以下是如何做到这一点:
def get_result(doc)
removed_elms = []
result = doc.each_slice(2).to_a.map do |ah|
# if you just need them different (not the first one 'Enter' and the second one 'Leave') you need to set the commented condition
# if ['Enter','Leave'].include?(ah[0][:action] && ah[1][:action]) && ah[0][:action] != ah[1][:action]
if ah[0][:action] == 'Enter' && ah[1][:action] == 'Leave'
ah
else
removed_elms << ah
nil
end
end.compact
[result.flatten, removed_elms.flatten]
end