Ruby哈希迭代,索引访问和值映射

时间:2015-10-31 16:49:32

标签: arrays ruby indexing hash iteration

我有一个散列,其值与数组类型值配对,如下所示:

someHash={:key1=>[element1a,element1b],:key2=>[element2a,element2b]}

我试图遍历Hash,访问索引并修改Hash的数组类型值,如下所示:

hash.each_with_index{|(key,array),index|
    element1,element2 = array
    element1 = "new value"; element2="new value2"
}
hash

但是,当我返回哈希时,没有发生更新。对于我可以使用的数组(或不同的解决方法),是否存在类似map!方法的哈希方法?

4 个答案:

答案 0 :(得分:1)

您的代码只是为某些局部变量赋值。您需要将新值分配给哈希本身:

hash.each_with_index do |(key, array), index|
  element1, element2 = array
  element1 = "new value"
  element2 = "new value2"
  hash[key] = [element1, element2]
end

或更短(取决于您尝试实现的目标):

hash.each do |key, array|
  hash[key] = ["new value", "new value2"]
end

或者:

hash.update(hash) do |key, array|
  ["new value", "new value2"]
end

答案 1 :(得分:0)

执行此操作时:

element1, element2 = array

您正在创建指向数组中元素的指针。当你稍后这样做时:

element1 = "new value"; element2="new value2"

您可以设置那些指向新值的指针,因此不会修改初始数组。

一个解决方案是:

hash.each_with_index do |(key,array),index|
    array[0] = "new_value"
    array[1] = "new value2"
end

hash
然而,我会做这样的事情:

hash.each do |key, array|
    array[0] = "new_value"
    array[1] = "new value2"
end

hash

答案 2 :(得分:0)

您不需要each_with_index。实际上,hash_不存在each_with_index(键是索引)。你可以这样做:

some_hash.each do |key, value|
    value[0], value[1] = "new value", "new value2"
end

答案 3 :(得分:0)

代码中的问题是您只更改本地引用而不是数组中的值。

你可以这样使用map

new_hash = Hash[hash.map{|k,v| [k, ["new value","new value2"]]}]

这不会改变原始哈希值。