Ruby - 基于 1 个键比较/合并 2 个哈希数组

标签 ruby key compare hashtable hash

假设我有 2 个哈希数组,如下所示,

local_todos = [{name: "abc", title: "abcdwer", api_id: "1234567", updated_at: "2013-22-12"},
{name: "abcd", title: "abcdwe", api_id: "098098", updated_at: "2013-22-11"},
{name: "abcde", title: "abcdqw", api_id: "345345", updated_at: "2013-22-18"},
{name: "abcdef", title: "abcder", api_id: "234456", updated_at: "2013-22-15"}]

google_tasks = [{name: "abc", title: "xxxxx", id: "1234567", updated: "2013-22-19"},
{name: "abcd", title: "zzzzz", id: "098098", updated: "2013-22-15"},
{name: "abcde", title: "abcdqw", id: "345345", updated: "2013-22-18"},
{name: "abcdef", title: "abcder", id: "234456", updated: "2013-22-15"}]

现在我想,合并/比较/过滤这两个完全基于 api_id(local_todos) 和 id(google_tasks) 的哈希,这样只有 id/api_id(两者是相同的值)有区别在 updated_at(local_todos) 和 updated(google_tasks) 值被打印为输出

期望的输出将是这样的,

["1234567", "098098"]

因为如果您检查这 2 个 ID 具有不同的 updated/updated_at 值。

有什么帮助吗?

最佳答案

只是简单的选择:

local_todos.map do | v1 |
   google_tasks.any? {|v2| v1[ :api_id ] == v2[ :id ] && v1[ :updated_at ] != v2[ :updated ] } && v1[ :api_id ] || nil
end.compact
# => ["1234567", "098098"]

要比较代码,您可以使用以下代码:

funcs =
[ proc { local_todos.map {|v1| google_tasks.any? {|v2| v1[ :api_id ] == v2[ :id ] && v1[ :updated_at ] != v2[ :updated ] } && v1[ :api_id ] || nil }.compact },
  proc {
   local_todos.inject([]) do |result,l_td|
    if found = google_tasks.detect {|g_td| g_td[:id] == l_td[:api_id] and  g_td[:updated] != l_td[:updated_at]}
        result << found[:id]
    end
    result
  end
},
]

def ctime func
   time = 0
   1000.times { time += Benchmark.measure { 1000.times { func.call } }.to_a[5].to_f }
   rtime = time /= 1000000
end

funcs.each {| func | p ctime( func ) }

# 3.9753190517425536e-05
# 4.056975722312927e-05

在我的工作台结果中,第一个代码稍微快一些。

关于Ruby - 基于 1 个键比较/合并 2 个哈希数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20949953/

相关文章:

ruby-on-rails - 如何在 Ruby 中仅在等于 "."之前分割点 "="

javascript - 如何为数组中的每个对象提供自己的键?

c++ - string.compare for c++

java递归测试arraylist是否相等

ruby - 正则表达式/从 ruby​​ 中的字符串中删除斜线

ruby - 如何合并数组组?

ruby - 在 ruby​​ 数组中查找整数 (Fixnum) 值

php - 在 codeigniter 的 form_multiselect() 中设置多个值

python - 日期对象只有年和月

r - 如何按列比较两个 data.frames 并忽略每列中元素的顺序