这可能是获取对象的最短代码:
var idArray = $("*[id]").map(function() {
return this.id;
}).get();
var obj = $.extend({}, idArray);
你的问题有更好的解决方案 - 关联数组
但是根据我在其他答案评论中读到的信息,这种对象结构可能并不适合您的情况。您想要的是检查特定ID是否已经存在。这个对象
{
0: "ID1",
1: "otherID",
...
}
这并不会帮助太多。一个更好的对象是您的关联数组对象:
{
ID1: true,
otherID: true,
...
}
因为这会使得通过在if
语句中检查此条件来确定特定ID变得简单:
if (existingIDs[searchedID]) ...
所有不存在的ID都会失败,所有存在的ID都会返回true。但是要将您的ID数组转换为此对象,您应该使用以下代码:
。
var idArray = $("*[id]").map(function() {
return this.id;
}).get();
var existingIDs = {};
$.each(idArray, function() { existingIDs[this] = true; });
或者根据所需的结果,您可以进一步优化此部分代码:
var existingIDs = {};
$("*[id]").each(function() { existingIDs[this.id] = true; });
这将最大程度地加快现有ID搜索速度。检查ID唯一性可能不需要分层对象结构,只要您可以在O(1)内获取有关ID存在的信息即可。上部联想数组对象将为您提供此超级快速的可能性。当您使用新ID创建新对象时,您只需执行以下操作即可将其轻松添加到现有的联想数组对象中:
existingIDs[newID] = true
就是这样了。新的ID将与同一关联数组对象中的其他ID一起被缓存。
注意:我看到你的代码使用了隐式全局变量(listy
变量)。请小心并尽可能避免使用。
性能测试
如@Blazemonger建议,我认为这并不站得住脚。全部归结为以下两点:
如果第一个通常很低,例如在普通HTML页面中,CSS类比ID更频繁地使用,并且如果第二个足够大,则此性能测试证明关联数组可以比仅使用jQuery快得多。此测试中使用的HTML是Stackoverflow移动站点上问题列表的副本(因此我需要从源代码中消除脚本)。我故意选择了一个真实网站内容的例子,而不是制作有利于其中一种解决方案的测试用例。
如果您的搜索范围小得多,那么直接使用jQuery会更快,因为它不需要启动关联数组准备工作,并立即开始搜索。