从 JavaScript 中的关联数组中获取第一项的最有效方法是啥?

Posted

技术标签:

【中文标题】从 JavaScript 中的关联数组中获取第一项的最有效方法是啥?【英文标题】:What is the most efficient way to get the first item from an associative array in JavaScript?从 JavaScript 中的关联数组中获取第一项的最有效方法是什么? 【发布时间】:2010-09-15 16:25:29 【问题描述】:

我只需要从 javascript 中一个相当大的关联数组中取出第一项(实际上,只是第一个键)。这是我目前的做法(使用 jQuery):

getKey = function (data) 
    var firstKey;
    $.each(data, function (key, val) 
        firstKey = key;
        return false;
    );
    return firstKey;
;

只是猜测,但我想说必须有更好(阅读:更有效)的方法来做到这一点。有什么建议吗?

更新:感谢富有洞察力的答案和 cmets!我忘记了我的 JavaScript 101,其中规范说你不能保证关联数组中的特定顺序。不过,有趣的是,大多数浏览器都以这种方式实现它。我不希望在获得第一个键之前对数组进行排序,但考虑到我的用例,这可能是不可避免的。

【问题讨论】:

如果是关联数组,怎么知道第一项是什么? 我认为他的意思是插入到数组中的第一项。 如果需要,您需要构建自己的 Stack 实现。 Assoc 数组不保留任何键顺序。 他们在 JS 中做——向后兼容! :D 【参考方案1】:

您可以通过引用从Object.keys() 返回的第一个条目来避免创建函数:

var firstKey = Object.keys(data)[0];

对于排序键列表中的第一个条目,只需添加对 .sort() 方法的调用:

var firstKey = Object.keys(data).sort()[0];

【讨论】:

这是我认为最好的... +1! 如果您需要对旧版浏览器的支持,请确保在您的脚本中包含此 polyfill:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…【参考方案2】:

在关联数组(即对象)中实际上没有 firstlast 元素。您希望获得的唯一顺序是解析器保存元素的顺序——并且不保证与此一致。

但是,如果您希望第一个出现,那么经典的方式实际上可能更容易一些:

function getKey(data) 
  for (var prop in data)
    return prop;

想要避免继承属性?

function getKey(data) 
  for (var prop in data)
    if (data.propertyIsEnumerable(prop))
      return prop;

【讨论】:

实际上,您的订单是有保证的——不是根据规范,而是因为过去有太多网站依赖于订单。基本上,您可以保证 for (a in b) .. 将按照它们在运行时添加到对象的确切顺序覆盖 b 中的每个可枚举属性。 (我上面的空间用完了)例外情况是您在原型链中枚举属性的顺序仍然因浏览器而异 @CyprianGuerra 它应该适用于“自己的”属性和 Erik has already added an answer with it。此问答仅在正式指定 Object.keys() 之前一年多发布(EMCA 262 5th 于 2009 年 12 月发布)。 @JonathanLonowski 我的错,对不起,不知何故错过了。感谢您指出这一点。【参考方案3】:

除了乔纳森的解决方案,我们还可以扩展默认的数组功能:

Array.prototype.getKey = function() 
  for (var prop in this)
    if (this.propertyIsEnumerable(prop))
      return prop;

【讨论】:

以上是关于从 JavaScript 中的关联数组中获取第一项的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript:通用获取数组中的下一项

MongoDB - 仅获取已填充文档的数组中的第一项 - 例如user.populate('posts', 'images.0')

获取数组第一项的最快方法是啥? [复制]

访问从 API 解码的数组中的第一项

如何从 Javascript 中的对象列表中获取键的值?

快速排序的JavaScript实现