Optimization 优化jQuery筛选器以获得唯一元素

Optimization 优化jQuery筛选器以获得唯一元素,optimization,jquery,jquery-data,jquery-filter,Optimization,Jquery,Jquery Data,Jquery Filter,我有一个元素集合,虽然每个元素都有一个唯一的字符串标识符,我不能安全地将它的值用作元素ID,因为我不能保证它只包含。因此,我将标识符存储在jQuery.data()对象的每个元素中。虽然我可以使用数据-属性,但我不太喜欢在可能需要转义引号等的地方使用选择器,但如果有巨大的效率提升,应该考虑到这一点。使用.data()对象的解决方案也很好,因为它可以适用于任何数据类型 我想知道选择单个元素最有效的方法是什么。目前,这是我的解决方案: function get_group($from, group)

我有一个元素集合,虽然每个元素都有一个唯一的字符串标识符,我不能安全地将它的值用作元素
ID
,因为我不能保证它只包含。因此,我将标识符存储在jQuery
.data()
对象的每个元素中。虽然我可以使用
数据-
属性,但我不太喜欢在可能需要转义引号等的地方使用选择器,但如果有巨大的效率提升,应该考虑到这一点。使用
.data()
对象的解决方案也很好,因为它可以适用于任何数据类型

我想知道选择单个元素最有效的方法是什么。目前,这是我的解决方案:

function get_group($from, group) {
  var $result = $();
  $from.each(function() {
    if($(this).data("group") == group) {
      result = $(this);
      return false;
    }
  });
  return $result;
}
我迭代每个结果,直到找到匹配项。当我这样做的时候,我就打破了循环。通过将
$result
初始化为空jQuery对象,我将始终返回jQuery,我认为这与标准实践最为一致,尤其是
.filter()
方法


我认为这比在函数中使用
.filter()
要好,因为它显式返回单个(或无)项,并在需要时立即停止迭代,但是有更好的方法吗?

正如您所说,如果每个数据组都是唯一的,您可以这样做-

$('[data-group="'+group+'"]')

似乎
for
循环比您得到的循环快:

function get_group ($from, group)
    for (var i = 0; i < $from.length; i++) {
        if ($($from[i]).data("group") == group) {
            return $($from[i]);
        }
    }
    return $();
}
函数获取组($from,group)
对于(变量i=0;i<$from.length;i++){
如果($($from[i])。数据(“组”)==组){
返回$($from[i]);
}
}
返回$();
}
JSPerf:


编辑:重写为函数,添加了return$()

是否动态创建这些元素?或者您可以控制它们的创建和附加到页面上吗?如果您的数据不包含引号(单引号或双引号),为什么不使用数据组属性?我不喜欢这种方法,因为将未知字符串附加到jQuery选择器中似乎不合理(尤其是因为引号问题)我不喜欢这种方法,因为在jQuery选择器中添加未知字符串似乎不明智(尤其是因为引号问题),但这种方法使代码紧凑易读,并且jQuery有一种故障保护机制,如果选择器不匹配,则返回空数组。如果给定的sting破坏了JS语法,就会出现问题。我猜决定将取决于实际文本是由程序提供的(相当安全)还是由用户提供的(可能不安全)。虽然很优雅,但它比简单的for循环慢近60%。性能与代码清晰度权衡。但问题是“优化”尼古拉斯的so+1;)谢谢,但我没有使用HTML5
data-
属性,我使用的是jQuery
data()
对象的属性。然而,看看您的测试,这似乎是一个非常好的解决方案——您真的需要在jQuery中包装来自[i]的
$吗?另外,如果循环未成功完成,您需要返回
$()
。是的,我知道您没有。我添加了测试,因为一些答案表明这是最快的解决方案。至于在jQuery中包装[i]
中的
$from[i]
是必要的,因为
$from[i]
不是jQuery对象。我用
.eq(I)
添加了一个示例,但是这个示例的速度较慢。这是最好的答案,很抱歉花了这么长时间才对其进行识别。
function get_group ($from, group)
    for (var i = 0; i < $from.length; i++) {
        if ($($from[i]).data("group") == group) {
            return $($from[i]);
        }
    }
    return $();
}