繁体   English   中英

Javascript排序数组两次(不同的排序方法)

[英]Javascript sorting array twice (different sort methods)

我有一个数组,该数组在页面加载时根据需要对数组进行排序,具体取决于当前日期,它显示具有未来日期的对象,然后显示具有过去日期的对象,我们称其为dateToPlay。

我有两个单选按钮,可调用该方法对同一数组进行排序,并且在页面加载时,它对数组的排序方式与我上面提到的完全一样。 问题是当我使用其他排序方法createdAt对数组进行排序时,该方法仅按创建日期对数组进行排序。 此方法可以对它进行很好的排序,但是当我按另一个收音机按datesToPlay进行排序时,它不会对数组进行排序。

function SortByPlayTime(a, b){
var currentDate = new Date();
    if(lastDateOfObjectsInArray > currentDate){
        if(a.attributes.start >= currentDate){
            if(a.attributes.start > b.attributes.start && b.attributes.start >= currentDate)
                return 1;
            else
                return -1;
        } else if(b.attributes.start >= currentDate){
            if(b.attributes.start > a.attributes.start)
                return -1;
          else
                return 1;
     }
    else{
        if(a.attributes.start > b.attributes.start)
            return 1;
        else
            return -1;
    }
} else{
    if(a.attributes.start > b.attributes.start)
        return -1;
    else
        return 1;
}


function SortByCreation(a, b){
if(a.attributes.createdAt > b.attributes.createdAt)
    return 1;
else
    return -1;

基本上,我正在做的是我有一个数组,其中所有对象都是im试图排序的,该数组的大小各不相同,可以像1000个或更多对象。

在函数loadArrayToShowFilters()中,我要做的是准备一个将在表中显示的新数组(有关屏幕,请参见上面的注释)。 这是因为我模仿一个表,但实际上我在做数组的所有工作。 此数组的长度始终为100或更短。

function loadArrayToShowFilters() {
//array = the array of objects Im trying to filter
var sizeArrayToShow;
if(array.length < 100)
    sizeArrayToShow = array.length;
else
    sizeArrayToShow = 100;
arrayTableToShow = [];
//arrayTableToShow = This is the array that holds the objects that are shown on the table
for (var i = 0; i < sizeArrayToShow; i++) {
    arrayTableToShow[i] = array[i];
};

触发排序的事件:事件单击两个单选按钮。

执行实际排序的代码:在单击每个单选按钮的事件上,我分别执行array.sort(SortByCreation)等操作。

样本数据:{“开始”:{“ __ type”:“日期”,“ iso”:“ 2018-02-01T11:00:00.000Z”},“结束”:{“ __ type”:“日期”,“ iso “:” 2018-02-01T12:00:00.000Z“},” createdAt“:” 2018-01-29T20:37:51.477Z“,” updatedAt“:” 2018-02-23T03:12:15.968Z“, “ objectId”:“ dSVZXFAIyf”}

它基本上只是一个带有对象的数组,每个具有可变属性的对象都具有变量start和createdAt,这些变量用于进行排序

大事记:

'click #lastCreated'(event){
    orderArregloCreatedAt();
},
'click #nextToPlay'(event){
    orderArregloPlayTime();
}

function orderArregloCreatedAt() {
    array.sort(SortByCreation);
   loadArrayToShowFilters();
}

function orderArregloPlayTime() {
    array.sort(SortByPlayTime);
    loadArrayToShowFilters();
}

解决此问题所需的信息仍然十分匮乏。 但是我认为故障在于SortByPlayTime的排序算法。

这有点疯狂,但是请您告诉我以下更改是否可以实现:

  • 页面加载时预期的排序顺序?
  • 单击单选按钮后的预期排序顺序?
  • 即使错了,两者的结果也一样?

代码更改:

function SortByPlayTime(a, b) {
    var currentDate = new Date();
    // a is future, b is past, so a shows above b = -1
    if (a.attributes.start >= currentDate && b.attributes.start < currentDate) return -1;
    // a is past, b is future, so a shows below b = 1
    if (a.attributes.start < currentDate && b.attributes.start >= currentDate) return 1;
    // both a and b are similarly future or past so compare on their values alone, in ascending order
    // if a > b then it should show below b, = positive result
    return a.attributes.start - b.attributes.start;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM