javascript按最接近的开始日期时间排序,以显示到最远的日期和另一个属性

Bog*_*ila 6 javascript sorting

我必须根据具有多个属性的当前日期时间,按照开始日期时间进行排序。例如,我有以下列表:

<ul>
    <li data-startDate="09-04-2019 15:00" data-inplay=false>Name1</li>
    <li data-startDate="09-04-2019 15:30" data-inplay=false>Name2</li>
    <li data-startDate="09-04-2019 15:20" data-inplay=false>Name3</li>
    <li data-startDate="09-04-2019 16:00" data-inplay=false>Name4</li>
    <li data-startDate="09-04-2019 15:00" data-inplay=true> Name5</li>
    <li data-startDate="09-04-2019 15:10" data-inplay=false>Name6</li>
    <li data-startDate="09-04-2019 15:05" data-inplay=true> Name7</li>
    <li data-startDate="08-04-2019 12:05" data-inplay=false>Name8</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

当前日期时间为09-04-2019 15:15,所需的输出应为:

<ul>
    <li data-startDate="09-04-2019 15:00" data-inplay=false>Name1</li>
    <li data-startDate="09-04-2019 15:30" data-inplay=false>Name2</li>
    <li data-startDate="09-04-2019 15:20" data-inplay=false>Name3</li>
    <li data-startDate="09-04-2019 16:00" data-inplay=false>Name4</li>
    <li data-startDate="09-04-2019 15:00" data-inplay=true> Name5</li>
    <li data-startDate="09-04-2019 15:10" data-inplay=false>Name6</li>
    <li data-startDate="09-04-2019 15:05" data-inplay=true> Name7</li>
    <li data-startDate="08-04-2019 12:05" data-inplay=false>Name8</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我尝试过此方法,但不包含游戏内参数,而且排序也不正确

var list = $("ul > li");
var target = new Date().getTime();
var sortByStartTime = function (a, b) {
    var ret = 0;
    var startDateA = $(a).data("startdate");
    var startDateB = $(b).data("startdate");
    var dateA = startDateA.split(" ")[0].split("-");
    var timeA = startDateA.split(" ")[1].split(":");
    var dateB = startDateB.split(" ")[0].split("-");
    var timeB = startDateB.split(" ")[1].split(":");
    startDateA = new Date(dateA[2], dateA[1] - 1, dateA[0], timeA[0], timeA[1]);
    startDateB = new Date(dateB[2], dateB[1] - 1, dateB[0], timeB[0], timeB[1]);
    var dA = Math.abs(startDateA.getTime() - target);
    var dB = Math.abs(startDateB.getTime() - target);
    if (dA < dB) {
        ret = -1;
    } else if (dA > dB) {
        ret = 1;
    }  else {
        ret = 0;
    }
    return ret;
};

list.sort(sortByStartTime);

for (var i = 0; i < list.length; i = i + 1) {
    list[i].parentNode.appendChild(list[i]);
}
Run Code Online (Sandbox Code Playgroud)

基本上,该列表应按最接近的开始日期时间(相对于当前日期时间)排序,但如果有一些播放,它们应位于最接近的开始日期时间(相对于当前日期时间)排序的列表顶部。最远的。我希望我解释得足够清楚。任何帮助表示赞赏,谢谢。

Avc*_*vcS 0

排序逻辑:

  1. 按数据输入true或false排序,使用number来简化排序逻辑(降序排序)
  2. 如果差异在零的另一侧,则先保留正值,后保留负值(按降序排序)
  3. 如果两个日期与当前时间的差值在 0 的同一侧,则按绝对值排序(升序排序)

var list = Array.from(document.querySelectorAll("ul > li"));
var target = new Date('09-04-2019 15:15');
var boolValue = { true: 1, false: 0 };
var sortByStartTime = function (a, b) {
    var diffA = new Date(a.dataset.startdate) - target;
    var diffB = new Date(b.dataset.startdate) - target;
    var inplayA = boolValue[a.dataset.inplay];
    var inplayB = boolValue[b.dataset.inplay];
    return inplayB - inplayA || (
        diffA < 0 === diffB < 0 ? Math.abs(diffA) - Math.abs(diffB) : diffB - diffA
    );
};

list.sort(sortByStartTime);

for (var i = 0; i < list.length; i = i + 1) {
    list[i].parentNode.appendChild(list[i]);
}
Run Code Online (Sandbox Code Playgroud)
<ul>
  <li data-startDate="09-04-2019 15:00" data-inplay=false>Name1</li>
  <li data-startDate="09-04-2019 15:30" data-inplay=false>Name2</li>
  <li data-startDate="09-04-2019 15:20" data-inplay=false>Name3</li>
  <li data-startDate="09-04-2019 16:00" data-inplay=false>Name4</li>
  <li data-startDate="09-04-2019 15:00" data-inplay=true> Name5</li>
  <li data-startDate="09-04-2019 15:10" data-inplay=false>Name6</li>
  <li data-startDate="09-04-2019 15:05" data-inplay=true> Name7</li>
  <li data-startDate="08-04-2019 12:05" data-inplay=false>Name8</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

PS:替换new Date('09-04-2019 15:15');new Date();以获得你想要的。我对日期进行了硬编码,以表明结果符合您的要求。