【问题标题】:Transforming all array values into hashes?将所有数组值转换为哈希?
【发布时间】:2018-06-24 00:44:52
【问题描述】:

这里是初学者问题,对不起:

我有一个名为 data 的数组。它由我从 CSV 映射出来的哈希数组组成:

[
{:status=>"new", :number=>"215", :subject=>"25", :case=>"First", :attachment=>"alpha, beta"},
{:status=>"old", :number=>"213", :subject=>"21", :case=>"Second", :attachment=>"alpha, beta"}
]

我想将哈希值发布到 API,但该 API 要求所有值都是数组(因为它们都可能包含多个值)。 如何将所有哈希的值转换为数组? 预期结果,如下所示:

[
{:status=>["new"], :number=>["215"], :subject=>["25"], :case=>["First"], :attachment=>["alpha", "beta"]}
{:status=>["old"], :number=>["213"], :subject=>["21"], :case=>["Second"], :attachment=>["alpha", "beta"]}
]

我知道我能做到:

hashed_data[0].map { |k, v| [ k,[v] ] }.to_h

但是如何将它应用到数组中的每个散列?

在这种情况下,我不能直接调用 :attachment,因为它不会总是以相同的方式命名。

【问题讨论】:

  • 您的哈希值有两次状态键,它们不是有效的哈希值。这是你的真实情况吗?
  • @SebastianPalma,严格来说,它们是有效的(至少在 Ruby 2.4.1 中)
  • 取决于什么是有效的,但是如果你对第一个哈希应用任何操作,期望结果也包含重复的键,那么结果将不是预期的。结果将包含重复键的最后定义 - 与以前的 Ruby 版本一样。
  • @SebastianPalma 啊废话。我的错误 - 它实际上是一个不同的键,双打。更改它以防止混淆,谢谢。

标签: arrays ruby hash iteration


【解决方案1】:

如果你想改变现有的数组,我会这样做:

array.each {|e| e.transform_values! {|value| Array(value)} }
#=> [{:status=>["25"], :number=>["215"], :case=>["First"], :attachment=>["alpha, beta"]}, 
#    {:status=>["21"], :number=>["213"], :case=>["Second"], :attachment=>["alpha, beta"]}]

【讨论】:

  • 这不会为attachment 生成所需的值,这是["alpha","beta"]Array 作为单独的元素而不是单个String
  • @engineersmnky,真的,我离开是作为家庭作业,所以不是 did-my-work-instead-of-me 网站 :)
  • @Ilya 谢谢!这将解决我 90% 的问题。我故意没有为附件询问解决方案,因为我有兴趣为自己找到一个解决方案:))
猜你喜欢
  • 2019-10-27
  • 2019-05-23
  • 2012-10-29
  • 1970-01-01
  • 2020-01-26
  • 2021-11-01
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多