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

check if result exists inside of 3 arrays of hashes

3 个散列数组 likes(@contest)["data"], shares(@contest)["data"], comments(@contest)["data"] 具有以下结构:

赞(@contest)["data"]

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

分享(@contest)["data"]

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

评论(@contest)["data"]

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

我只想得到结果,在这三个例子中,公共哈希值或哈希值

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

如果 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"}]

这是 shorthand 用于:

a.reduce { |common, arr| common & arr }

您可以使用&计算交集,这将给出3个数组中共有的哈希值:

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