【问题标题】:Rails/ruby make new hashRails/ruby 生成新的哈希
【发布时间】:2016-10-06 10:25:18
【问题描述】:

我有一个数组数组

arr = [ 
['category','subcat','detail'],['category1','subcat1','detail1']
]

我想用它做一个哈希{'category'=>'category','subcat'=>'subcat','detail'=>'detail'}...,other hashes from array

hash={}

我在做什么

arr.each{|el|
hash['category'] = el[0];
hash['subcat'] = el[1];
hash['detail'] = h[2];
}

但它只返回最后一个元素

hash=>{category:'category1',subcat:'subcat1',detail:'detail1'}

当我使用现有的哈希键时,它可以完美运行,但是当我尝试设置新键时 - 不起作用

如何解决?

【问题讨论】:

  • 请修复您的示例代码,它不起作用。 (顺便说一句,:category 不等于 "category")
  • arr 中是否总是正好有两个子数组?
  • @Jordan,可能有很多数组
  • 请编辑您的问题以包含“大量数组”的示例和预期输出。
  • 问题是你不断用后面的数组覆盖散列的键。哈希只有唯一的键。 documentation 对此很清楚:A Hash is a dictionary-like collection of unique keys and their values.

标签: ruby-on-rails arrays ruby hash


【解决方案1】:

哈希只能有唯一的键,不允许重复。当您插入重复项时,您会覆盖任何以前存在的具有相同名称的键:

思考这个:

foo = {} # => {}
foo['a'] = 1
foo # => {"a"=>1}

foo 现在是单个键/值对的哈希。如果我尝试使用相同的键添加另一个元素,我只会覆盖以前的值,我不会添加另一个键/值对:

foo['a'] = 2
foo # => {"a"=>2}

这基本上就是你正在做的事情:

arr.each{|el|
  hash['category'] = el[0];
  hash['subcat'] = el[1];
  hash['detail'] = h[2];
}

为了使您的代码正常工作,您需要为循环中的每次迭代找到不同的键名。

我可以添加不同的键/值:

foo['b'] = 3
foo # => {"a"=>2, "b"=>3}

有关详细信息,请参阅the documentation 或任何 Ruby 哈希教程。

【讨论】:

    【解决方案2】:

    您可以将Array#transpose 与Array#to_h 结合使用。如果您不关心哈希的键是否是字符串,那么您可以简单地这样做:

    arr.transpose.to_h # => {"category"=>"category1", "subcat"=>"subcat1", "detail"=>"detail1"}
    

    如果您需要将键作为符号,那么您需要做更多的工作:

    arr.transpose.to_h.inject({}){|hash, (k,v)| hash[k.to_sym] = v; hash }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 2012-08-30
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多