【问题标题】:What's the most appropriate data structure for this? (Are there disadvantages or caveats to having an Array with gaps in it?)最合适的数据结构是什么? (有一个有间隙的数组有缺点或警告吗?)
【发布时间】:2013-12-12 08:45:59
【问题描述】:

我基本上需要一个特定数字到其他值的字典。我将从:

var o = /*??????*/

然后:

o[4] = foo;
o[8] = bar;

您会注意到索引远不是连续的,尽管作为键它们肯定很重要。

为此使用数组有什么缺点,或者我应该只在对象上使用数字键?

【问题讨论】:

  • 你能告诉我们最终结构的目的是什么吗?
  • 如果数据的顺序是连续的(并且必须保持如此),您可能需要使用数组。否则,对于非顺序数据(顺序无关紧要),最好坚持使用对象。有关您实际解决的问题的更多信息会有所帮助...
  • 你没有告诉我们数字的范围,你也没有描述你需要执行的一组操作。
  • 我需要能够使用值4 检索 foo 的值,并且我需要能够通过其他数字保存其他可检索值。它只是一本字典。我可能还需要迭代,当然,Array 方法和其他细节不会伤害我,如果我不使用它们,它们可能会很好,这取决于使用这样的数组有什么注意事项。所以,这就是我要问的。
  • 按字典我假设您正在寻找一个类似字典的python 又名哈希表。下面是如何在 javascript 中实现它:stackoverflow.com/questions/130543/…

标签: javascript arrays object data-structures


【解决方案1】:

坚持“简单”的对象。数组意味着顺序迭代,这会给人们带来错误的想法——你不想移动、拼接或推送到这个对象,它本质上是一个哈希。

如果偶然的数字键不代表有序序列,那么当其他人(更不用说你自己)接近代码时,你只是在给他们错误的想法。

【讨论】:

  • 我认为这很重要。
【解决方案2】:

Javascript 对象是稀疏的,数组只是具有自动维护的长度属性(实际上比最大索引大一,而不是定义元素的数量)和一些附加方法的特殊对象。无论哪种方式,您都是安全的;如果您需要它的额外功能,请使用数组,否则使用对象。

【讨论】:

  • 我想我的问题是数组的额外功能如何与我的非序列数据配合得很好。
  • @user3025492 不太好,有时——稀疏数组(即存在更高索引时索引为空的数组)会在 IE8 和更低版本中导致奇怪的错误。我曾经在真正的大数组上使用 lodash 的 each 方法时遇到了这个问题(源是固定的)。无论引擎实现如何,认知影响都是不好的:您不确定自己并且很可能在未来;其他阅读您的代码的人可能会更糟。归根结底,Array 的方法完全不适合这本字典,而且从表面上看也没有任何优势:使用普通对象!
  • @Barney 你是对的。我更喜欢使用数组作为列表,当你需要地图时使用普通对象
  • @Barney AFAIC IE BS 不算数。但是您的其余评论很有道理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多