从 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】:在关联数组(即对象)中实际上没有 first 或 last 元素。您希望获得的唯一顺序是解析器保存元素的顺序——并且不保证与此一致。
但是,如果您希望第一个出现,那么经典的方式实际上可能更容易一些:
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 中的关联数组中获取第一项的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB - 仅获取已填充文档的数组中的第一项 - 例如user.populate('posts', 'images.0')