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

问题描述

有两个哈希数组

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

expected = [{text: "A",state: "enabled"}]

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

results = [{id: 2}]

此刻,我正在使用它,但是它很长,并且不能用于大型阵列。有更好的方法吗?

 actuals        = actuals.map{|a| a.slice(:text,:type,:state)}
 expected       = expected.map{|a| a.slice(:text,: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?
       } 

解决方法

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

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

resulting_ids = results.map(&:id)
,
exp = expected.first
  #=> {text: "A",state: "enabled"}

actual.reject { |h| h == h.merge(exp) }.map { |h| h.slice(:id) }
  #=> [{:id=>2}]

Try it

actual中的散列如果与exp合并时不受影响,则被拒绝,这意味着要合并的散列对于exp中的所有键具有相同的值。然后,使用Hash#sliceh中每个剩余的哈希actual映射到{ id: h[:id] }

该方法的一个优点是,如果将exp更改为具有不同键的哈希,则无需更改代码。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...