【问题标题】:Creating a Hash with keys from an array and empty arrays as the values使用数组中的键和空数组作为值创建哈希
【发布时间】:2015-06-07 16:43:33
【问题描述】:

我有数组标签,它由许多字符串组成,我需要使用这些字符串来创建一个新的哈希(内容),其中每个值都是一个空数组。我目前有Hash[*tags.map {|k| [k, nil]}.flatten],但这会返回:

{
  "tag1" => nil,
  "tag2" => nil,
  "tag3" => nil
}

当我想要它时

{
  "tag1" => [],
  "tag2" => [],
  "tag3" => []
}

抱歉,这是一个愚蠢的问题,但我用谷歌搜索了一圈,找不到答案。谢谢!

【问题讨论】:

  • 注意:我尝试在 Hash[*tags.map {|k| 中将 nil 替换为 [ ] [k, nil]}.flatten],这不起作用

标签: arrays ruby hash


【解决方案1】:

使用flatten,映射[],而不是您尝试过的nil,然后使用flatten(1)。这仅消除了数组的第一层,因此您可以将 ['tag1', [], ...] 传递给 Hash[]

> tags = %w[tag1 tag2 tag3]
 => ["tag1", "tag2", "tag3"]
> tags.map {|k| [k, []]}.flatten
 => ["tag1", "tag2", "tag3"]
> tags.map {|k| [k, []]}.flatten(1)
 => ["tag1", [], "tag2", [], "tag3", []]
> Hash[*tags.map {|k| [k, []]}.flatten(1)]
 => {"tag1"=>[], "tag2"=>[], "tag3"=>[]}

如果您从Hash[] 中删除splat (*),您也可以完全避免flatten,因为::[] 也接受一对列表。

> tags.map {|k| [k, []]}
 => [["tag1", []], ["tag2", []], ["tag3", []]]
> Hash[tags.map {|k| [k, []]}]
 => {"tag1"=>[], "tag2"=>[], "tag3"=>[]}

【讨论】:

  • 你也可以写Hash[*tags.flat_map { |k| [k, []]}]
【解决方案2】:

Ruby 的 Array 支持(笛卡尔)乘积,因此您可以利用这一点,而无需在块内构建额外的逻辑:

> tags.product([[]]).to_h
=> {"tag1"=>[], "tag2"=>[], "tag3"=>[]}

简单。

【讨论】:

  • 不错。非常好! (我注意到了心灵融合。顺便说一句,“瑞秋”是谁?)
  • 我觉得粘贴评论很有趣,但由于这是相同的解决方案...问题是same Array object gets assigned 对所有三个值,这可能是不可取的。
  • 大卫,我本来想说“这完全错了。你在想什么?不会这么说。 @Kristján,你这样做是对的。很好的收获。
  • 我注意到我有点失望,否则这是一个非常巧妙的解决方案。现在我要寻找方法来使用product 整个星期:)
【解决方案3】:

根据docs Hash.new 接受一个块,您可以使用该块在每次访问不属于哈希的新键时提供默认值。 所以你可以使用这个

tags = %w(tag1 tag2 tag3)
h = Hash.new{ |hash, key| hash[key] = [] }
tags.each{ |tag| h[tag] }
# h == {"tag1"=>[], "tag2"=>[], "tag3"=>[]}
h['tag4']
# h == {"tag1"=>[], "tag2"=>[], "tag3"=>[], "tag4"=>[]}

【讨论】:

    【解决方案4】:

    另一种方式:

    tags = %w|tag1 tag2 tag3|
    
    Hash.new { |h,k| h[k] = [] }.tap { |h| h.values_at(*tags) }
      #=> {"tag1"=>[], "tag2"=>[], "tag3"=>[]} 
    

    【讨论】:

      猜你喜欢
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 2012-03-27
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多