【问题标题】: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

标签: javascript jquery arrays associative


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多