Сортировка массива в порядке nodejs по дате (от последнего к старому) - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь отсортировать следующий массив так, чтобы самый последний event_end был первым

{
   "results":[
      {
         "event_start":"2017-11-27T09:00:00Z",
         "event_end":"2017-11-27T09:00:00Z",
         "attendance":0,
         "title":"Administrate Training Session",
         "type":"delegate"
      },
      {
         "event_start":"2018-02-01T09:00:00Z",
         "event_end":"2018-02-01T09:00:00Z",
         "attendance":0,
         "title":"Health and Safety Awareness (HSA)",
         "type":"delegate"
      },
      {
         "event_start":"2018-02-19T09:00:00Z",
         "event_end":"2018-04-30T09:00:00Z",
         "attendance":0,
         "title":"SMSTS",
         "type":"delegate"
      }
   ]
}

Мой текущий код (и это после того, как попробовали почти все различные способы сделать это):

Array.from(outcome).sort(sortFunction);
      function sortFunction(a, b){
        if(b[3] === a[3]){
          return 0;
        } else {
          return (b[3] < a[3]) ? -1 : 1;
        }
      }

И просто, чтобы прояснить, как создается массив:

var history = JSON.parse(body);
      var outcome = {};
      var key = 'results';
      outcome[key] = [];
      history.forEach(delegate => {
          var data = null;
          var sessionKey;
          var attendanceCount = 0;
          var sessionCount = 0;   
          var attended = 0;    
          Array.from(delegate['session_attendance']).forEach(function(val){
            if(!val.__proto__.__proto__){
              sessionCount++;
            }
          });      
          var type;              
          for(var k in delegate['session_attendance']){
            sessionKey = k;
            if(k['status'] == true){
              attendanceCount++;
            }
          }
          if(attendanceCount == 0){
            attended = attendanceCount;
          } else {
            (attendanceCount / sessionCount) * 100
          }
          if(delegate['registration']['booking_contact'] !== null){
            if(delegate['registration']['booking_contact']['id'] == delegate['contact']['id']){
              type = 'booking_contact';
            } 
          } else{
            type = 'delegate';
          }
          data = {
            'objectId': delegate['id'],                
            'title': delegate['event']['title'],
            'event_start': delegate['event']['start'],
            'event_end': delegate['session_attendance'][sessionKey]['start'],
            'attendance': attended,
            'type': type
          }
          outcome[key].push(data);
        })

Я уверен, что это очевидно, но кто-нибудь может указать мне, куда я иду не так? и как правильно его отсортировать?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

var obj = {
   "results":[
      {
         "event_start":"2017-11-27T09:00:00Z",
         "event_end":"2017-11-27T09:00:00Z",
         "attendance":0,
         "title":"Administrate Training Session",
         "type":"delegate"
      },
      {
         "event_start":"2018-02-01T09:00:00Z",
         "event_end":"2018-02-01T09:00:00Z",
         "attendance":0,
         "title":"Health and Safety Awareness (HSA)",
         "type":"delegate"
      },
      {
         "event_start":"2018-02-19T09:00:00Z",
         "event_end":"2018-04-30T09:00:00Z",
         "attendance":0,
         "title":"SMSTS",
         "type":"delegate"
      }
   ]
}

obj.results.sort((a, b) => {
  return new Date(b.event_end) - new Date(a.event_end)
})

console.log(obj.results)
0 голосов
/ 20 февраля 2020

Функция, которую sort получает, получает 2 параметра, каждый из которых является объектом, поэтому вы можете получить доступ к его свойствам.

Примерно так должно работать:

arr.sort((a, b) => {
    return a.event_end > b.event_end ? -1 : 1;
})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...