JavaScript中从关联数组中获取第一个元素的最有效方法是什么?

47

我需要从一个非常大的 JavaScript 关联数组中获取第一个元素(实际上只需要第一个键)。以下是我目前的方法(使用 jQuery):

我需要仅仅取得JavaScript中一个相当大的关联数组的第一项(事实上只需第一个键)。这是我目前的做法(使用jQuery):


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

仅仅是猜测,但我想肯定有更好(即更高效)的方法来做这件事。有任何建议吗?

更新:感谢有见地的答案和评论!我忘记了我的 JavaScript 101,规范中说你不能保证一个关联数组的特定顺序。有趣的是,大多数浏览器确实是这样实现的。虽然我不想在获取第一个键之前对数组进行排序,但考虑到我的用例可能无法避免。


1
如果它是一个关联数组,你怎么知道第一项是什么? - John Millikin
我认为他指的是插入到数组中的第一个项目。 - Eric Schoonover
如果你想要这样做,你需要构建自己的堆栈实现。关联数组不保留任何键排序。 - Toby Hede
他们在JS中做到了向后兼容性! :D - olliej
3个回答

73

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

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

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

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

2
我认为这是最好的...加1! - Riad
4
如果您需要支持旧版浏览器,请确保在您的脚本中包含此填充程序:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys - thdoan

45

在关联数组(即对象)中,实际上不存在“第一个”或“最后一个”元素。您唯一能够获取的顺序是解析器保存元素的顺序,但这不能保证与其一致。

但是,如果您想要“第一个出现”的元素,经典的方式实际上可能会更容易:

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

想要避免继承属性吗?

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

8
实际上,您可以保证顺序——不是通过规范,而是由于过去有太多的网站依赖顺序。基本上,您可以保证对于(b中的a) ..将按照它们在运行时添加到对象中的确切顺序覆盖b中的每个可枚举属性。 - olliej
2
唯一的例外是在原型链中枚举属性的顺序仍然因浏览器而异。 - olliej
1
@CyprianGuerra,它应该适用于“自有”属性,而Erik已经在其中添加了答案(https://dev59.com/4nVC5IYBdhLWcg3wz0l9#26617955)。这个Q&A是在“Object.keys()”正式指定之前发布的一年多(EMCA 262 5th于2009年12月发布)。 - Jonathan Lonowski
@JonathanLonowski 我的错,抱歉,不知何故错过了。感谢您指出。 - cprn

2
除了Jonathan的解决方案,我们还可以扩展默认的数组功能:
Array.prototype.getKey = function() {
  for (var prop in this)
    if (this.propertyIsEnumerable(prop))
      return prop;
}

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