当前位置: 首页 > 知识库问答 >
问题:

将数组的哈希合并到哈希数组中

邢臻
2023-03-14

所以,我有一个带有数组的哈希,就像这样:

{"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"}] 

知道如何有效地做到这一点吗?

请注意,真实世界的使用场景可能包含数量可变的散列键。

共有3个答案

祁均
2023-03-14

如果您的数据集非常大,可以考虑使用枚举器::Lazy。

这样Ruby就不会在计算期间创建中间数组。

这就是@Ursus answer可以改进的地方:

h[:name]
  .lazy
  .zip(h[:surname])
  .map { |name, surname| { 'name' => name, 'surname' => surname } }
  .to_a
谯嘉懿
2023-03-14

我建议编写允许任意数量属性的代码。这并不比假设有两个(< 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} 

其余的计算类似。

相云
2023-03-14

试试这个

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 级深。任何