使用JavaScript/jQuery对一组列表元素进行排序和分离
Sort and separate a set of list elements using JavaScript/jQuery
我有个问题对列表进行排序(可以使用默认的JS/jquery排序功能(将已排序的列表拆分为不同的子列表,每个子列表最多包含"x"项,"x"是您传入的参数样本结果假设x=2
<ul>
<li> 4 </li>
<li> 1 </li>
<li> 7 </li>
<li> 5 </li>
<li> 3 </li>
</ul>
编写一个函数将其转换为
<ul>
<li> 1 </li>
<li> 3 </li>
</ul>
<ul>
<li> 4 </li>
<li> 5 </li>
</ul>
<ul>
<li> 7 </li>
</ul>
您可以在合理的范围内随意使用任何您喜欢的库/引用(即,不要使用具有"splitList"功能的库(。关键是在DOM操作方面尽可能高效地做到这一点。
我通过创建单独的列表来解决这个问题,并删除了原始列表,但我想知道如何只修改现有列表。(我的意思是在穿越时动态修改(
html第一个:
<ul id="list">
<li> 4 </li>
<li> 1 </li>
<li> 7 </li>
<li> 5 </li>
<li> 3 </li>
</ul>
<div id="container"></div>
javascript(jquery(:
function sortText(a,b){
return $(a).text().trim() > $(b).text().trim() ? 1 : -1;
};
var ul = $('#list');
var elements = ul.find('li').detach();
var i=2;
var lastul;
var container = $('#container');
elements.sort(sortText).each(function(index){
if (index % i === 0) {
container.append(lastul);
lastul = $('<ul></ul>');
}
lastul.append(elements[index]);
})
container.append(lastul);
ul.remove();
var optionTexts = [];
$("ul li").each(function() { optionTexts.push($(this).text()) });
optionTexts.sort();
//alert(optionTexts.length);
var splityby = 2;//change this value how you want to split
var itmes= parseInt(optionTexts.length/splityby);
var remaining = optionTexts.length%splityby;
//alert(itmes+'and'+remaining);
var st='';
var i=0;
for(k=0;k<itmes+remaining;k++){
st+='<ul>';
for(j=0;j<splityby;j++){
if(i<optionTexts.length){
st+='<li>'+optionTexts[i++] +'</li>' ;
}
}
st+='</ul>';
}
$('#hi').append(st);
html
<div id="hi"></div>
<ul> <li> 4 </li> <li> 1 </li> <li> 7 </li> <li> 5 </li> <li> 3 </li> </ul>
最有效的排序方法是使用本机Array.sort
方法(jQuery().sort
实现Array.sort
(Fiddle:http://jsfiddle.net/RJEJQ/1/。
通过去掉jQuery,使用document.createElement()
和普通的for()
循环,代码可以变得更加高效。
var originalUl = $('ul');
var listElements = originalUl.children('li'); //List
listElements.sort(function(x, y){
return parseInt(x.textContent, 10) - parseInt(y.textContent);
});
//Sorted by number, 1, 2, 3, ...
var newList = $(""); //Placeholder
listElements.each(function(i){
if(i%2 == 0){ //If even, a new list has to be created
originalUl.before(newList);
newList = $("<ul>"); //Create new list
}
newList.append(this);
});
if(newList.length) { // If there are any remaining list elements in the holder.
originalUl.before(newList);
}
originalUl.remove(); //Remove original, empty ul.
正如这个演示所示,结果看起来像:
ul
li 1
li 3
ul
li 4
li 5
ul
li 7
这部分使用了我之前写的一个答案,该答案将元素划分为组,并添加了先排序的功能:
工作演示:http://jsfiddle.net/AndyE/QVRRn/
var i = 0,
ul = $("ul"),
lis = ul.children().detach(),
group;
// Sort the elements
lis.sort(function (a, b) {
return $.text(a).localeCompare($.text(b));
});
// Wrap the elements
while ((group = lis.slice(i, i += 2)).length)
group.wrapAll('<ul></ul>');
// Replace the original UL element
ul.replaceWith(lis.closest("ul"));
在操作<li>
元素之前,将其从文档中分离是很重要的,这将使大型集合的操作速度更快。
如果您必须操作DOM,我相信您的问题已经得到了回答。但是
DOM操作很慢。还连接字符串。
排序函数取自这里:如何使用jQuery按字母顺序对列表进行排序?
现场演示:http://jsfiddle.net/gknjQ/1/
相关文章:
- 我们怎样才能将内含子J用于一组特定的元素
- 创建一组元素JointJS
- 使用第 n 个类型设置一组八个元素的样式
- 如何检查焦点是否离开了一组元素
- 是否可以加快向DOM添加一组元素的速度
- 使用javascript在一组元素上切换类
- JavaScript-更改一组包含特定文本和变量ID元素的链接
- 一次显示n个列表元素,jQuery
- 如何使用jQuery查找一组元素的父元素
- 为什么 .data() 适用于一组元素,但不适用于单个元素
- 如何从一组元素中获取 ID 并保存在数组中
- 如何创建一组从属选择列表,其中连续列表依赖于前面列表选项的选择
- 使一组元素透明,但一个除外
- 当一组元素的所有元素都具有特定值时,如何隐藏表单元素
- 如何在一组元素上触发事件
- 使用 JavaScript 从 HTML 元素中删除一组特定的事件侦听器
- JQuery:用另一组元素替换一组元素的优雅方式
- 如何使用 jquery 隐藏下一组元素
- Jquery:如何使一个列表在一组列表中不可排序
- 使用JavaScript/jQuery对一组列表元素进行排序和分离