所以,我有一个带有数组的哈希,就像这样:
{"name": ["John","Jane","Chris","Mary"], "surname": ["Doe","Doe","Smith","Martins"]}
我想将它们合并到一个哈希数组中,组合相应的元素。
结果应该是这样的:
[{"name"=>"John", "surname"=>"Doe"}, {"name"=>"Jane", "surname"=>"Doe"}, {"name"=>"Chris", "surname"=>"Smith"}, {"name"=>"Mary", "surname"=>"Martins"}]
知道如何有效地做到这一点吗?
请注意,真实世界的使用场景可能包含数量可变的散列键。
如果您的数据集非常大,可以考虑使用枚举器::Lazy。
这样Ruby就不会在计算期间创建中间数组。
这就是@Ursus answer可以改进的地方:
h[:name]
.lazy
.zip(h[:surname])
.map { |name, surname| { 'name' => name, 'surname' => surname } }
.to_a
我建议编写允许任意数量属性的代码。这并不比假设有两个(< code>:name和< code>:surname)更困难,但是它提供了更大的灵活性,例如,适应将来对属性的数量或命名的更改:
def squish(h)
keys = h.keys.map(&:to_s)
h.values.transpose.map { |a| keys.zip(a).to_h }
end
h = { name: ["John", "Jane", "Chris"],
surname: ["Doe", "Doe", "Smith"],
age: [22, 34, 96]
}
squish(h)
#=> [{"name"=>"John", "surname"=>"Doe", "age"=>22},
# {"name"=>"Jane", "surname"=>"Doe", "age"=>34},
# {"name"=>"Chris", "surname"=>"Smith", "age"=>96}]
上述示例的步骤如下:
b = h.keys
#=> [:name, :surname, :age]
keys = b.map(&:to_s)
#=> ["name", "surname", "age"]
c = h.values
#=> [["John", "Jane", "Chris"], ["Doe", "Doe", "Smith"], [22, 34, 96]]
d = c.transpose
#=> [["John", "Doe", 22], ["Jane", "Doe", 34], ["Chris", "Smith", 96]]
d.map { |a| keys.zip(a).to_h }
#=> [{"name"=>"John", "surname"=>"Doe", "age"=>22},
# {"name"=>"Jane", "surname"=>"Doe", "age"=>34},
# {"name"=>"Chris", "surname"=>"Smith", "age"=>96}]
在最后一步中,将b
的第一个值传递给map
的块,并为块变量分配其值。
a = d.first
#=> ["John", "Doe", 22]
e = keys.zip(a)
#=> [["name", "John"], ["surname", "Doe"], ["age", 22]]
e.to_h
#=> {"name"=>"John", "surname"=>"Doe", "age"=>22}
其余的计算类似。
试试这个
h[:name].zip(h[:surname]).map do |name, surname|
{ 'name' => name, 'surname' => surname }
end
寻找一种优雅的方式以特殊的方式合并两个散列数组: 如果名称关键字匹配,则结果必须包含< code>new_data的所有名称散列,仅包含< code>old_data的额外数据。 我的第一次尝试是这样的,但是它创建了一个额外的散列:
问题内容: 我有一个实现了hashCode()的向量类。它不是我写的,而是使用2个质数对2个向量分量进行异或运算。这里是: …因为这是来自已建立的Java库,所以我知道它可以正常工作。 然后,我有一个Boundary类,其中包含2个向量:“开始”和“结束”(代表直线的端点)。这两个向量的值是边界的特征。 在这里,我尝试为构成该边界的向量的唯一2元组(起点和终点)创建一个良好的hashCode()。
我有几个数组(我们称它们为“原始数组”)。每个数组都包含哈希值,在每个哈希值中,我都有来自收到的电子邮件的数据。例如电子邮件地址、姓名等。我还有一个 uid,这是收到的电子邮件上的唯一标识符。原始数组之间会有很多重复,数组的共同点越多越好(在理想情况下,它们应该包含相同的电子邮件和相同的电子邮件数据)。 输入样本: 我现在想对所有这些进行重新排序,以便得到一个新数组(我们称之为“一级数组”)。在第
我正试图让我的头脑围绕着一个哈姆特的细节。我会用Java自己实现一个,只是为了理解。我熟悉尝试,我想我得到了HAMT的主要概念。 基本上, 两种类型的节点: null null 我不太明白的部分是碰撞检测和缓解。在链接的论文中,他暗示了这一点: 然后将现有键插入到新的子哈希表中,并添加新键。每使用5个以上的散列比特,冲突的概率就减少1/32倍。偶尔,可能会消耗整个32位哈希,必须计算一个新的哈希来
常见问题,Int Raku,如何合并,合并两个哈希? 说: 如何获取
对于一个电子商务应用程序,我试图将选项的散列(每个选项都有一个选择数组)转换为表示这些选择组合的散列数组。例如: 输入内部可能有其他选项,每个选项的选项数量不确定,但它只会嵌套 1 级深。任何