Ruby,如何比较散列数组

时间:2016-04-21 10:05:57

标签: ruby

我有一系列哈希,如:

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希望有人可以帮我解决

1 个答案:

答案 0 :(得分:1)

根据您创建方法的方式,您可以这样做:

def get_result(doc)
   doc.each_sli­ce(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_sli­ce(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