使用jQuery查找最近的后代的哪种方法更有效?

时间:2014-12-23 16:58:43

标签: javascript jquery performance

以下两种方法都可以完成相同的任务。他们搜索与选择器匹配的后代,这些后代没有嵌套在另一个匹配中。我试图确定这两种方法中哪一种更有效,但我不确定计算它们之间性能差异的最佳方法是什么。有任何想法吗?

我目前倾向于我想出的那个(第一个),因为它不需要触摸与选择器不匹配的节点。但是,如果嵌套太深,第二个嵌套可能会减少接触。如果性能差异是纯粹的情境,是否有一个很好的检查来确定使用哪个逻辑集?

function closestDescendants(selector, context)
{
    /// <summary>
    /// Similar but opposite to closest (ancestor), 
    /// Returns the descendants matching the selector, 
    /// but not their descendants.
    /// </summary>
    /// <param name="selector">The jQuery selector for the descendants.</param>
    /// <param name="context">The parent to search under.</param>
    if(!context)
    {
        context = document;
    }

    var $context = $(context);

    // Using find/filter/closest
    return $context
        .find(selector)
        .filter(function()
        {
            var $this = $(this);
            var $closest = $this.parent().closest(selector, $context);
            return !$closest.length || $context.is($closest);
        });
}

在编写第一种方法后,我遇到了http://bugs.jquery.com/ticket/8263,它使用了下面的逻辑。

function closestDescendants(selector, context)
{
    /// <summary>
    /// Similar but opposite to closest (ancestor), 
    /// Returns the descendants matching the selector, 
    /// but not their descendants.
    /// </summary>
    /// <param name="selector">The jQuery selector for the descendants.</param>
    /// <param name="context">The parent to search under.</param>
    if(!context)
    {
        context = document;
    }

    var $context = $(context);

    var selection = [];
    var query = function($node)
    {
        $node.children().each(function()
        {
            var $this = $(this);
            if($this.is(selector))
            {
                selection.push(this);
            }
            else
            {
                query.call($this);
            }
        });
    };

    query.call($context);
    return this.pushStack(selection, "closestDown", selector);
}

1 个答案:

答案 0 :(得分:1)

嗯,它几乎总是取决于场景,所以在找到最有效的后代方面没有不同的赢家。

但在你的情况下,我建议用console.time包装你的函数调用,并亲自看看哪一个更快完成。

console.time('My Benchmark');
closestDescendants(parameters);
console.timeEnd('My Benchmark');

这将在控制台内打印以毫秒为单位的时间。只需确保您使用的是Chrome或Firefox,并且不要在生产环境中使用console.time(它在IE中不起作用并且可能会出错)。