这可能是您可以编写的用于获取对象的最短代码:
// your existing code (a tiny bit changed)
var idArray = $("*[id]").map(function() {
return this.id;
}).get();
// this one liner does the trick
var obj = $.extend({}, idArray);
解决问题的更好方法 - 关联数组
但是正如我在其他答案中的评论中所读到的那样,这个对象结构在您的情况下可能不是最好的。你想要的是检查一个特定的 ID 是否已经存在。这个对象
{
0: "ID1",
1: "otherID",
...
}
不会有太大帮助。一个更好的对象将是您的关联数组对象:
{
ID1: true,
otherID: true,
...
}
if
因为这将使通过在语句中使用此条件进行简单检查来确定特定 ID 变得简单:
if (existingIDs[searchedID]) ...
所有不存在的 ID 都将不符合此条件,并且所有确实存在的 ID 都将返回true
。但是要将您的 ID 数组转换为该对象,您应该使用以下代码:
// your existing code (a tiny bit changed)
var idArray = $("*[id]").map(function() {
return this.id;
}).get();
// convert to associative "array"
var existingIDs = {};
$.each(idArray, function() { existingIDs[this] = true; });
或给定所需的结果,您可以对其进行更多优化:
var existingIDs = {};
$("*[id]").each(function() { existingIDs[this.id] = true; });
这将最大限度地加快您现有的 ID 搜索速度。只要您可以在 O(1) 中获取有关 ID 存在的信息,检查 ID 唯一性可能不需要分层对象结构。上层关联数组对象将为您提供这种超快速的可能性。当您创建一个具有新 ID 的新对象时,您可以轻松地将其添加到现有的关联数组对象中,只需执行以下操作:
existingIDs[newID] = true;
就是这样。新 ID 将与其他 ID 一起缓存在同一个关联数组对象中。
注意:我可以看到您的代码隐含了全局(listy
变量)。小心并尽可能避免。
性能测试
正如@Blazemonger 所暗示的那样,这并不成立,我会说这种说法可能是正确的。这一切都归结为:
- 您拥有的具有 ID 的元素数量
- 您想要进行的搜索次数
如果第一个通常像在常规 HTML 页面中一样低,其中 CSS 类比 ID 更频繁地使用,并且如果第二个足够大,那么这个性能测试证明关联数组可以比单独使用 jQuery 快一点。此测试中使用的 HTML 是 Stackoverflow 在移动网站上的问题列表的副本(因此我从源代码中删除脚本的工作较少)。我特意举了一个真实世界网站内容的例子,而不是准备好的测试用例,可以故意制造它以支持一种或另一种解决方案。
如果您的搜索规模要小得多,那么我使用直接的 jQuery 会更快,因为它不需要启动关联数组准备并立即开始搜索。