JavaScript 中的有序哈希

新手上路,请多包涵

JavaScript 对象没有存储属性的顺序(根据规范)。使用 for...in 循环时,Firefox 似乎保留了属性定义的顺序。这种行为是我可以依赖的吗?如果没有,是否有一段实现有序哈希类型的 JavaScript 代码?

原文由 hekevintran 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 285
2 个回答

这个问题作为最热门的搜索结果出现。在找不到有序哈希后,我就写了这个小 coffescript。希望这将帮助人们登陆此页面:

 ## OrderedHash
# f = new OrderedHash
# f.push('a', 1)
# f.keys()
#
class OrderedHash
 constructor: ->
   @m_keys = []
   @m_vals = {}

  push: (k,v) ->
    if not @m_vals[k]
      @m_keys.push k
    @m_vals[k] = v

  length: () -> return @m_keys.length

  keys: () -> return @m_keys

  val: (k) -> return @m_vals[k]
  vals: () -> return @m_vals

原文由 vrdhn 发布,翻译遵循 CC BY-SA 3.0 许可协议

2016 年的 JavaScript,特别是 EcmaScript 6,支持 Map 内置类

Map 对象按插入顺序迭代其元素——for…of 循环为每次迭代返回一个 [key, value] 数组。

这就是你所需要的。 (不过,我想知道为什么这是这个数据结构描述中的第一个信息。)

例如,

 m = new Map()

m.set(3,'three')
m.set(1,'one')
m.set(2,'two')

m // Map { 3 => 'three', 1 => 'one', 2 => 'two' }

[...m.keys()] // [ 3, 1, 2 ]

文档 中的示例:

 var myMap = new Map();
myMap.set(0, 'zero');
myMap.set(1, 'one');

myMap // Map { 0 => 'zero', 1 => 'one' }

for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}

for (var key of myMap.keys()) {
  console.log(key);
}

for (var value of myMap.values()) {
  console.log(value);
}

for (var [key, value] of myMap.entries()) {
  console.log(key + " = " + value);
}

原文由 Ondra Žižka 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏