我有这个html
<ul id="theList">
<li><span class="to-date" date-fromdate ="2014-12" data-todate="2015-01">2015-01</span></li>
<li><span class="to-date" date-fromdate ="2016-12" data-todate="2017-01">2017-01</span></li>
<li><span class="to-date" date-fromdate ="2014-12" data-todate="now">now</span></li>
<li><span class="to-date" date-fromdate ="2015-01" data-todate="now">now</span></li>
</ul>和当前的JavaScript
function sortList(list) {
var $list = $(list);
var elems = $.makeArray($list.find("li"));
elems.sort(function(a, b) {
var $aStr = $(a).find(".to-date").attr("data-todate");
var $bStr = $(b).find(".to-date").attr("data-todate");
var $aStrFrom = $(a).find(".to-date").attr("data-fromdate");
var $bStrFrom = $(b).find(".to-date").attr("data-fromdate");
if ($aStr != 'now') {
return true;
} else {
return new Date($aStr) < new Date($bStr);
}
});
$list.html(elems);
}
sortList("#theList");我想要实现的是,当一个项目有“现在”在截止日期的攻击,他们是排序从日期attr,并放在列表的顶端。在截止日期攻击中,剂量有“现在”的项目按列表底部的日期进行排序。
那件事怎么可能?
这是一把小提琴
发布于 2015-08-09 17:44:07
传递给sort的比较函数应该返回一个整数,而不是布尔值。简而言之,comparator(a, b)应该返回1(如果是a > b ),-1 (如果是a < b )和0(如果相等)。
另外,您将对某些new Date('now')值执行b操作,这会产生无效的日期。你不会想搞砸这些的。
只要仔细地处理a, b (小提琴)的所有可能的情况,就可以使用一个良好的比较函数来重现所需的排序:
if ($aStr == 'now') {
if ($bStr == 'now')
return -comparator(new Date($aStrFrom), new Date($bStrFrom));
else
return -1;
} else if ($bStr == 'now') {
return 1;
} else {
return comparator(new Date($aStr), new Date($bStr));
}
function comparator(a, b) {
return a > b ? 1 : (a == b ? 0 : -1);
}发布于 2015-08-09 17:57:50
只使用一种方法(小提琴) --参见注释:
function sortList(list) {
var $list = $(list);
var elems = $.makeArray($list.find("li"));
elems.sort(function (a, b) {
var $aStr = $(a).find(".to-date").attr("data-todate");
var $bStr = $(b).find(".to-date").attr("data-todate");
var $aStrFrom = $(a).find(".to-date").attr('date-fromdate');
var $bStrFrom = $(b).find(".to-date").attr('date-fromdate');
if($aStr === 'now' && $bStr === 'now') { // if both have now - sort by from-date
return new Date($bStrFrom).getTime() - new Date($aStrFrom).getTime(); // reverse to change sort order
}
if($aStr === 'now') {
return -1; // if first have now return -1
}
if($bStr === 'now') {
return 1; // if second have now return 1
}
return new Date($bStr).getTime() - new Date($aStr).getTime(); // if both lack now sort by to-date - reverse to change sort order
});
$list.html(elems);
}
sortList("#theList");https://stackoverflow.com/questions/31906541
复制相似问题