检查jQuery对象是否具有某些DOM元素的最快方法

时间:2016-03-23 16:06:59

标签: javascript jquery

我有一个带有一些DOM元素的jQuery对象。我拿这个对象并对其元素进行排序。但是有些元素具有优先权,所以当我排序时,我不能让它们处于没有优先权的元素之下。

示例:

private ArrayList<Profile> mProfiles

我是如何解决这个问题的:

<!-- original list -->
<el id='2' /> <!-- has priority -->
<el id='0' /> <!-- has priority -->
<el id='3' /> <!-- has priority -->
<el id='1' /> <!-- no priority -->
<el id='4' /> <!-- no priority -->

<!-- wrong way to sort -->
<el id='0' /> <!-- has priority -->
<el id='1' /> <!-- no priority -->
<el id='2' /> <!-- has priority -->
<el id='3' /> <!-- has priority -->
<el id='4' /> <!-- no priority -->

<!-- right way to sort -->
<el id='0' /> <!-- has priority -->
<el id='2' /> <!-- has priority -->
<el id='3' /> <!-- has priority -->
<el id='1' /> <!-- no priority -->
<el id='4' /> <!-- no priority -->

我的输出应该是var elements = $(selector); elements.sort(sort_by_id); var priority_elements = get_prio_elements(); //That's the only way to know which are the elements with priority var temp = $(); elements.each(function(){ if(priority_elements.is(this)) //check if element are inside priority list temp = temp.add($(this)); //push element in elements object order }); set_prio_elements(temp); 个对象。我的意思是:temp应该包含:

temp

按此顺序。

问题是这个代码对于大型列表(超过300 + - )非常慢。我想知道如何才能改善这一点。

A link at fiddle that could help understand.

2 个答案:

答案 0 :(得分:1)

了解您的JS代码实际上在做什么很棘手,因为您似乎错过了几个关键功能。

话虽如此,您声明您所需的输出是先按priority然后按id对元素进行排序。您可以在一次sort()电话中执行此操作。

首先请注意,创建自己的属性无效,因此priority应为data-priority。从那里你可以实现自己的sort()逻辑,如下所示:

$(selector).sort(function(a, b) {
    var $a = $(a), 
        $b = $(b), 
        aId = parseInt(a.id, 10), 
        bId = parseInt(b.id, 10);

    // sort by priority
    if ($a.data('priority') && !$b.data('priority'))
        return -1;
    else if (!$a.data('priority') && $b.data('priority'))
        return 1;

    // sort by id
    if (aId < bId)
        return -1;
    else if (aId > bId)
        return 1

    return 0;
});

Working example

请注意,通过使用三元表达式可以缩短上述内容,但我保持冗长,以便您可以清楚地看到发生了什么。

答案 1 :(得分:1)

您只能在sort_function中检查该元素是否具有其优先级&#39;属性设置为&#39; true&#39;?

我首先会收集2个数组中的所有元素:一个用于优先级=&#39; true&#39;而另一个则相反,对这些数组进行排序,然后将它们连接起来。

<强>更新 如果你愿意的话,我创造了这个小提琴,看看你能不能适应它 然后看看它是否更具资源效率 我猜它是,因为你不必经历整个元素&#39;再次反对,但我可能错了。

https://jsfiddle.net/virginieLGB/qev5r9yx/

发生了什么变化:
1)我们对两个对象进行排序

elements.sort(sort_by_id);
priority_elements.sort(sort_by_id);

2)我们只是在开始时将优先元素放回去,然后删除它们,然后撤消

  for( var i = elements.length - 1 ; i >= 0 ; i-- ) {
    var index = priority_elements.indexOf( elements[ i ] );
    if( index > -1 ) {
        var temp = elements[ i ];
        elements.splice( i , 1 );
      elements.unshift( temp );
      priority_elements.splice( index , 1 );
    }
  }

更新#2:

  

我的输出应该是临时对象。我的意思是:temp应该包含:
  <el id='0' /> <!-- has priority -->
  <el id='2' /> <!-- has priority -->
  <el id='3' /> <!-- has priority -->

那么,为什么不做你

priority_elements.sort( sort_by_id );


因为基本上,你似乎正在做的是获取优先级元素,然后检查原始列表中是否具有优先级,如果他们这样做,只需保留它们...... 但是你已经拥有它们了吗?或者我错过了什么?