我有一个带有一些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 + - )非常慢。我想知道如何才能改善这一点。
答案 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;
});
请注意,通过使用三元表达式可以缩短上述内容,但我保持冗长,以便您可以清楚地看到发生了什么。
答案 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 );
?
因为基本上,你似乎正在做的是获取优先级元素,然后检查原始列表中是否具有优先级,如果他们这样做,只需保留它们......
但是你已经拥有它们了吗?或者我错过了什么?