遍历元素以对其子元素排序
Iterate through elements to sort their childrens
我试图遍历具有特定类的所有元素,以根据其值属性对其子元素进行排序。我需要为每个父元素分别排序子元素。
Html结构:
<ul class="parentClass">
<li value="1">...</li>
<li value="10">...</li>
<li value="8">...</li>
</ul>
<ul class="parentClass">
<li value="8">...</li>
<li value="29">...</li>
<li value="5">...</li>
</ul>
JS代码:
function sortAll() {
$(".parentClass").each(function() {
var items = $(this).children("li").sort(function(a, b) {
var vA = $("li", a).attr("value");
var vB = $("li", b).attr("value");
return (vA > vB) ? -1 : (vA > vB) ? 0 : 1;
});
$(this).append(items);
});
}
我想要得到的:
<ul class="parentClass">
<li value="10">...</li>
<li value="8">...</li>
<li value="1">...</li>
</ul>
<ul class="parentClass">
<li value="29">...</li>
<li value="8">...</li>
<li value="5">...</li>
</ul>
我想我误解了一些关于迭代的东西。你能帮我找出我的错误吗?
我还想让你知道一些<li>
元素可能具有相同的值。
解决方案:
function sortAll() {
$(".parentClass").each(function() {
var items = $(this).children("li").sort(function(a, b) {
var vA = $(a).attr("value");
var vB = $(b).attr("value");
return (vA > vB) ? -1 : (vA > vB) ? 0 : 1;
});
$(this).append(items);
});
}
您应该使用$(a)
和$(b)
而不是$("li", a)
和$("li", b)
。a
和b
是指li
元素。您正试图找到li
元素的后代li
s ($(selector, context)
与$(context).find(selector)
相同)。查询返回空集合,随后attr
返回undefined
值。undefined > undefined
和undefined < undefined
都返回false
。sort
回调总是返回0
,这使得订单保持不变。
请看看降序排序的数据的例子。有一个关于数组排序的很好的答案和算法的描述。
您使用的三元运算符(vA > vB) ? -1 : (vA > vB) ? 0 : 1
行为怪异,导致顺序错误。
- 如果compareFunction(a, b)小于0,将a排序到比b低的索引,即a优先。
- 如果compareFunction(a, b)返回0,保持a和b相对于彼此不变,但相对于所有不同的排序元素。注意:ECMAscript标准不能保证这一点行为,因此不是所有的浏览器(例如Mozilla版本更新)至少回到2003年)尊重这一点。
- 如果compareFunction(a, b)大于0,则将b排序到比a低的索引。compareFunction(a, b)必须始终返回相同的值当给定特定的一对元素a和b作为它的2参数。
- 如果返回的结果不一致,则排序顺序未定义
如果vA > vB // true
将a排序到低于b的索引
因此,如果vA < vB // true
保持a和b不变。这是一个逻辑错误
function sortAll() {
// Define variables before loops.
var $container, $itemsColl;
$(".parentClass").each(function(key, value) {
// <ul> tag
$container = $(value);
$itemsColl = $container.children("li");
// Sort and appendTo() <ul>.
$itemsColl.sort(function(a, b) {
// Inverted for descendant sorting.
return $(b).attr('value') - $(a).attr('value');
})
.appendTo($container);
});
}
sortAll();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul class="parentClass">
<li value="1">1</li>
<li value="10">10</li>
<li value="8">8</li>
</ul>
<ul class="parentClass">
<li value="8">8</li>
<li value="29">29</li>
<li value="5">5</li>
</ul>
相关文章:
- 如何使用jquery对元素进行排序和定位
- 根据输入文本按元素排序,AngularJS
- 将元素排序到数组的顶部
- Scriptaculous排序表和句柄的问题(元素排序不正确)
- 如何使用jquery随机元素排序
- 是对集合中的所有元素排序,还是只对添加的元素排序
- 在case语句中对表元素排序时出现问题
- 类似于mason .js或同位素.js的打包布局,不按现有元素排序
- 如何根据子元素的值对父元素排序?
- 如何捕捉元素排序使用jQuery sortable
- Javascript:对数组的数组按每个内部数组中的第二个元素排序
- JS基于子元素对父元素排序
- 如何将Firebase子元素中的值与其他元素排序
- 工具提示在元素排序后停止工作
- 遍历元素以对其子元素排序
- 元素排序例程在Firefox中工作,但在Chrome中崩溃
- Javascript按数组中的元素排序
- JS:基于数据元素排序列表项
- 如何按三个元素排序
- JQ UI排序表:停止排序表内的一些元素排序