检查3个哈希数组中是否存在结果

时间:2015-08-09 18:04:35

标签: ruby-on-rails arrays ruby ruby-on-rails-3 hash

具有此结构的3个哈希likes(@contest)["data"], shares(@contest)["data"], comments(@contest)["data"]数组:

喜欢(@contest)[ “数据”

{"id"=>"101530244445809095", "name"=>"Jhon"}
{"id"=>"777860702747597", "name"=>"Pepe"}
.
.
.
.
.
.

股(@contest)[ “数据”

{"id"=>"101530244445809095", "name"=>"Andres"}
{"id"=>"777860702747597", "name"=>"Pepe"}
.
.
.
.
.
.

评论(@contest)[ “数据”

{"id"=>"101530244445809095", "name"=>"Paul"}
{"id"=>"777860702747597", "name"=>"Pepe"}
.
.
.
.
.
.

我想得到的结果是,在这种情况下,三者中的常见哈希值或哈希值

{"id"=>"777860702747597", "name"=>"Pepe"}

2 个答案:

答案 0 :(得分:4)

如果a的元素是您的哈希数组:

a = [[{ "id"=>"101", "name"=>"Jhon"   },
      { "id"=>"777", "name"=>"Pepe"   },
      { "id"=>"123", "name"=>"Zelda"  }],
     [{ "id"=>"101", "name"=>"Andres" },
      { "id"=>"777", "name"=>"Pepe"   },
      { "id"=>"123", "name"=>"Zelda"  }],
     [{ "id"=>"101", "name"=>"Paul"   },
      { "id"=>"777", "name"=>"Pepe"   }]]
    ]

所有数组中出现的哈希值为:

a.reduce(:&)
  #=> [{"id"=>"777860", "name"=>"Pepe"}] 

这当然适用于任意数量的数组和散列。

查看Enumerable#reduce(又名inject)的文档,了解正在发生的事情。您将看到该方法有四种形式。它是我在这里使用的第二个(由@Helder使用并由@Arup建议)。它给出了相同的结果:

a.reduce(&:&)
  #=> [{"id"=>"777860", "name"=>"Pepe"}]

这是:

的简写
a.reduce { |common, arr| common & arr }

答案 1 :(得分:2)

您可以使用&来计算交集,这将给出3个数组中共同的散列:

[likes(@contest)["data"], shares(@contest)["data"], comments(@contest)["data"]]
.inject(:&)