散列数组之间的交集但返回完整的散列

spa*_*kle 3 ruby arrays hash ruby-on-rails

有两个哈希数组

actual = [{id: 1, text: "A", type: "X", state: "enabled"}, {id: 2, text: "B", type: "X", state: "enabled"}]

expected = [{text: "A", type: "X", state: "enabled"}]
Run Code Online (Sandbox Code Playgroud)

我需要获取未包含在“预期”中的所有哈希的 :id。必须使用三个键(文本、类型、状态)进行比较。在这种情况下

results = [{id: 2}]
Run Code Online (Sandbox Code Playgroud)

目前我正在使用它,但它很长并且不适用于大型阵列。有没有更好的办法?

 actuals        = actuals.map{|a| a.slice(:text, :type, :state)}
 expected       = expected.map{|a| a.slice(:text, :type, :state)}
 not_expected   = actuals - expected
      
      results = actuals.select{|actual| 
         not_expected.find{|n| 
            n[:text]   == actual[:text] &&
            n[:type]   == actual[:type] &&
            n[:state]  == actual[:state]
         }.present?
       } 
Run Code Online (Sandbox Code Playgroud)

Chi*_*Ani 5

actual = [{id: 1, text: "A", type: "X", state: "enabled"}, {id: 2, text: "B", type: "X", state: "enabled"}]
expected = [{text: "A", type: "X", state: "enabled"}]
comparable_expected = expected.map { |e| e.slice(:text, :type, :state) }

results = actual.select do |a| 
  not comparable_expected.include? a.slice(:text, :type, :state)
end

resulting_ids = results.map(&:id)
Run Code Online (Sandbox Code Playgroud)