我最初做的实际问题是将数组的哈希值转换为哈希数组。如果有人对转换有任何意见,那么这很好,但实际问题是为什么哈希键的顺序在编辑后会发生变化。
我完全清楚这个问题,但这不是重复。事实上,我只是按照他们出来的顺序进行特定的调整。
我有一个数组和一个哈希。
数组(@headers)包含一个键列表。 @contents是一个填充数组的哈希。如上所述,我的任务是获得一个哈希数组。所以这是我的代码,非常简单。
@headers = (params[:headers])
puts "ORIGINAL PARAMS"
puts YAML::dump(@headers)
@contentsArray = [] #The purpose of this is to contain hashes of each object
@contents.each_with_index do |page,contentIndex|
@currentPage = Hash.new
@headers.each_with_index do |key, headerIndex|
@currentPage[key] ="testing"
end
puts YAML::dump(@currentPage)
@contentsArray[contentIndex] =@currentPage
end
puts "UPDATED CONTENTS"
puts YAML::dump(@contentsArray[0])
这是我无法绕过头来的。原始参数的键与更新的键的顺序不同。
注意:放置“ORIGINAL PARAMS”&提出“更新内容”部分。这是他们的输出:
ORIGINAL PARAMS
---
- " Page Title "
- " WWW "
- " Description "
- " Keywords "
- " Internal Links "
- " External Links "
- " Content files "
- " Notes "
---
UPDATED CONTENTS
---
" WWW ": page
" Internal Links ": testing
" External Links ": testing
" Description ": testing
" Notes ": testing
" Content files ": testing
" Page Title ": testing
" Keywords ": testing
为什么会这样?
记录。在标题循环后打印@currentPage给出:
" WWW ": page
" Internal Links ": page
" External Links ": page
" Description ": page
" Notes ": page
" Content files ": page
" Page Title ": page
" Keywords ": page
所以它必须是将值和键分配给@currentPage的方式,而不是当它进入数组时。
答案 0 :(得分:4)
在Ruby 1.8+中,哈希是UNSORTED列表
您通过键或值遍历散列的顺序可能看起来是任意的,通常不会处于插入顺序。
在RUBY 1.9+中,它们按照您推送物品的方式进行分类。
哈希按照插入相应键的顺序枚举其值。
答案 1 :(得分:2)
这是因为Ruby的Hash类型在内部使用哈希表数据结构,哈希表不跟踪其元素的顺序。
Ruby1.9的Hash使用链接的哈希表,跟踪其元素的序列。
所以在Ruby1.8中哈希是未排序的,并且在Ruby1.9哈希中进行了排序。