场景是这样的:我有一个目录,其中有多个JSON文件具有相似的数据,但不是完全相同的数据(结构相同,但数据可能不一定相同)。
我需要找到所有JSON文件之间相似的键(即所有JSON文件的交集)。
我像这样加载JSON文件
require 'json'
ARGV.each {|x|
JSON.parse(File.read(x))
}
从这里开始,我不知道如何得到哈希的交集 我知道你可以使用套装,如此
require 'json'
require 'set'
ARGV.each {|x|
JSON.parse(File.read(x)).to_set
}.reduce(:&)
但是根据这篇文章Hashes Vs. Set Performace,哈希似乎更快(虽然我猜这取决于用例)
那么,我怎样才能找到多个哈希的交集(键值对是相同的),而不使用Set?
答案 0 :(得分:1)
您不需要使用套装。集合维护所有元素都是唯一的,并且JSON哈希永远不会有两个相同的键值对。我只使用普通数组(to_a
)。
一个问题是您实际上是在reduce(:&)
上调用ARGV
而不是解析的JSON。您可以将each
更改为map
以解决此问题:
ARGV.map { |x|
JSON.parse(File.read(x)).to_a
}.reduce(:&)
如果要将其转换回哈希表单,可以使用to_h
。