【发布时间】:2014-05-02 00:14:22
【问题描述】:
上下文
我已经构建了一个我目前正在使用的 jQuery 插件,它让我将 DOM 元素存储在一个数组中,主要是为了能够在这些元素旁边存储更多信息,而无需使用不那么-快data().
这个数组看起来像:
[
{ element: DOMElement3, additionalData1: …, additionalData2: … },
{ element: DOMElement1, additionalData1: …, additionalData2: … },
{ element: DOMElement2, additionalData1: …, additionalData2: … },
]
这个插件的工作方式使我无法以可预测的顺序将这些元素推送到数组中,这意味着 DOMElement3 实际上可以找到低于 DOMElement2 的索引。
但是,我需要按照与它们包含的 DOM 元素出现在 DOM 中相同的顺序对这些数组元素进行排序。前面的示例数组,一旦排序,将如下所示:
[
{ element: DOMElement1, additionalData1: …, additionalData2: … },
{ element: DOMElement2, additionalData1: …, additionalData2: … },
{ element: DOMElement3, additionalData1: …, additionalData2: … },
]
当然,如果 DOMElement1 出现在 DOM 中的 DOMElement2 之前,DOMElement2 出现在 DOMElement3 之前。
废弃的解决方案
jQuery add() 方法返回一组 DOM 元素,其顺序与它们在 DOM 中出现的顺序相同。我可以使用它,但要求是我使用 jQuery 集合——这意味着我必须重构上述插件的一大块以使用不同的存储格式。这就是为什么我认为这是最后的解决方案。
另一种解决方案?
我原以为map() 和一种与每个 DOM 元素相关联的全局 DOM 索引可以解决问题,但似乎没有这样的“全局 DOM 索引”。
你能想到什么方法? (如果编写代码,欢迎使用 vanilla JS 和 jQuery。)
【问题讨论】:
-
我很好奇您是否将您的方法与
data进行了基准测试,看看您的方法有多快。 -
“这个插件的工作方式使我无法以可预测的顺序将这些元素推送到数组中” 怎么样?看起来你应该改正它
-
@JamesMontagne 我没有,但是将元素推送到数组 似乎 比使用 jQuery 的内部缓存将附加数据附加到每个元素要快。我将创建一个 JSperf 来立即对其进行基准测试并在此处发布。
-
@A.Wolff 该插件允许用户随时向该数组添加元素。因此,如果仍然使用相同的示例,有人首先将
DOMElement3添加到数组中,然后再添加DOMElement1和DOMElement2,则数组看起来与第一个代码示例中的完全相同。 -
@JamesMontagne 看起来我的方法确实比使用
data()更快,至少在以下测试用例中:jsperf.com/storing-data-next-to-dom-elements
标签: javascript jquery html arrays dom