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

And*_*ges 40 javascript arrays jquery associative

我需要从JavaScript中的一个相当大的关联数组中获取第一个项目(实际上,只是第一个键).这是我当前正在做的事情(使用jQuery):

getKey = function (data) {
    var firstKey;
    $.each(data, function (key, val) {
        firstKey = key;
        return false;
    });
    return firstKey;
};
Run Code Online (Sandbox Code Playgroud)

只是猜测,但我要说这是一个更好的(阅读:更有效)的方式来做到这一点.有什么建议?

更新:感谢有见地的答案和评论!我忘记了我的JavaScript 101,其中规范说你不能保证关联数组中的特定顺序.但有趣的是,大多数浏览器确实以这种方式实现它.在获得第一个密钥之前,我不想对数组进行排序,但考虑到我的用例,这可能是不可避免的.

Eri*_*son 56

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

var firstKey = Object.keys(data)[0];
Run Code Online (Sandbox Code Playgroud)

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

var firstKey = Object.keys(data).sort()[0];
Run Code Online (Sandbox Code Playgroud)

  • 如果您需要支持旧浏览器,请务必在您的脚本中包含此polyfill:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys (4认同)
  • 我认为这是最好的... +1! (2认同)

Jon*_*ski 43

关联数组(即对象)中实际上没有第一个最后一个元素.您可以希望获得的唯一顺序是解析器保存元素的顺序 - 并且不保证与此一致.

但是,如果你想要第一个出现,那么经典的方式实际上可能会更容易一些:

function getKey(data) {
  for (var prop in data)
    return prop;
}
Run Code Online (Sandbox Code Playgroud)

想避免继承属性?

function getKey(data) {
  for (var prop in data)
    if (data.propertyIsEnumerable(prop))
      return prop;
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,您可以保证订单 - 不是按规格,而是根据过去的订单,过多的网站.基本上你可以保证,(a in b)..将按照它们在运行时添加到对象的确切顺序覆盖b中的每个可枚举属性. (8认同)
  • `Object.keys(data)[0]`有什么问题? (4认同)
  • (我上面的空间用完了)这个例外就是你在原型链中枚举属性的顺序,从浏览器到浏览器的不同 (2认同)