使用JSON时对Ruby哈希进行排序

4
我有一个 Ruby 哈希表,我将其转换为 JSON 并传递给视图。然后 JavaScript 解析 JSON (JSON.parse) 并迭代它,输出键值对。如何对哈希表进行排序,以便按键字母顺序排序?可以在传递到视图之前或在 JavaScript 中完成此操作,只要最终结果是按键/值有序排列的列表。 hash.sort 不起作用,hash.to_a.sort 也不行... 如果这样做,我会发现无法正确迭代并获取键和值。
当应用排序时,for (key in myHash) {alert(key); alert(myHash[key]); } 将无法正常工作。

在 Ruby 1.8 中,哈希表是无序的。在 Ruby 1.9.2 中,它们是有序的。因此,我要么切换到 1.9.2,要么如果需要按某种顺序使用哈希表,则不使用哈希表。 - Jesse Wolgamott
@Jesse Wolgamott 是否能够按顺序检索哈希值在Ruby中并不是真正重要的问题,因为真正的问题是它们在JavaScript端不会被排序。 - Pointy
“在 Ruby 1.9.2 中,它们是有序的。”不是的,它们只记住它们被插入的顺序,但它们并没有被排序:“asdf = {z:26,a:1} #=> {:z=>26, :a=>1}”。 - the Tin Man
1
你最好不要担心Ruby在生成JSON之前对哈希进行排序。在Javascript解码JSON后,对哈希进行排序:从哈希中提取键,对它们进行排序,然后迭代每个键获取其值。 - the Tin Man
@Pointy:说得好,这个问题更多涉及JS而不是Ruby。@the Tin Man:非常明确。 - Jesse Wolgamott
4个回答

5
h = {"b"=>2, "a"=>1}

Hash[*h.sort.flatten].to_json

问题在于,当它被转换回 JavaScript 对象时,它不会保持排序状态。(哦,也就是说,除非“flatten”将其转换为数组而不是键/值对象...) - Pointy

2

2

将哈希转换为数组,然后对其进行排序:

var arr = [];
for (var key in hash) {
  if (Object.prototype.hasOwnProperty.call(hash, key))
    arr.push([key, hash[key]]);
}
arr.sort(function(h1, h2) {
  return h1[0] > h2[0] ? 1 : h1[0] < h2[0] ? -1 : 0;
});

现在你可以遍历"arr",并且键将按顺序排列。

你还可以在Ruby端将其变为数组,这样JavaScript代码就会得到一个正确排序的JSON数组,而不是一个JSON对象。


0

试试这个:

 h = {"b"=>2, "a"=>1}
 ActiveSupport::OrderedHash[*h.sort].to_json

如果Javascript端不维护哈希顺序,那么这种方法就行不通。 - the Tin Man
我知道 :-). 这是对用户问题的回答,即如何在Rails中创建有序哈希。 - Harish Shetty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接