Сортировка массива объектов javascript / typcript по метке времени пожарного депо - PullRequest
0 голосов
/ 11 октября 2018

У меня есть структура массива ниже

[
  {
    "id": "8gFUT6neK2I91HIVkFfy",
    "element": {
      "id": "8gFUT6neK2I91HIVkFfy",
      "archived": false,
      "updatedOn": {
        "seconds": 1538653447,
        "nanoseconds": 836000000
      }
    },
    "groupBy": "pr"
  },
  {
    "id": "9jHfOD8ZIAOX4fE1KUQc",
    "element": {
      "id": "9jHfOD8ZIAOX4fE1KUQc",
      "archiveDate": {
        "seconds": 1539250407,
        "nanoseconds": 62000000
      },
      "archived": false,
      "updatedOn": {
        "seconds": 1538655984,
        "nanoseconds": 878000000
      }
    },
    "groupBy": "pr"
  },
  {
    "id": "CeNP27551idLysSJOd5H",
    "element": {
      "id": "CeNP27551idLysSJOd5H",
      "archiveDate": {
        "seconds": 1539248724,
        "nanoseconds": 714000000
      },
      "archived": false,
      "updatedOn": {
        "seconds": 1538651075,
        "nanoseconds": 235000000
      }
    },
    "groupBy": "pr"
  },
  {
    "id": "Epd2PVKyUeAmrzBT3ZHT",
    "element": {
      "id": "Epd2PVKyUeAmrzBT3ZHT",
      "archiveDate": {
        "seconds": 1539248726,
        "nanoseconds": 226000000
      },
      "archived": false,
      "updatedOn": {
        "seconds": 1538740476,
        "nanoseconds": 979000000
      }
    },
    "groupBy": "pr"
  }
]

и код ниже для сортировки

Пример JSfiddle

http://jsfiddle.net/68wvebpz/

 let sortedData = this.arraydata.sort((a:any, b:any) => { return Number(new Date(b.element.date).getTime()) - Number(new Date(a.element.date).getTime()) })

Это делаетне оказывает никакого влияния.

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Превратите ваши строки в даты, а затем вычтите их, чтобы получить отрицательное, положительное или нулевое значение:

array.sort(function(a,b){
    return new Date(b.date) - new Date(a.date);
});
0 голосов
/ 11 октября 2018

Есть несколько проблем, которые нам нужно исправить:

  1. Ваш updatedOn объект не может быть преобразован в дату.Вам нужно проделать дополнительную работу.
  2. JavaScript не поддерживает наносекунды, только миллисекунды.Поэтому вам нужно разделить это число на миллион.
  3. Используя для сравнения getTime, вы фактически отбрасываете миллисекунды - эта функция возвращает секунды.

Комуисправьте первые два, используйте эту функцию:

function objToDate(obj) {
  let result = new Date(0);
  result.setSeconds(obj.seconds);
  result.setMilliseconds(obj.nanoseconds/1000000);
  console.log('With nano', result);
  return result;
}

Это создает новую дату, а затем устанавливает секунды и миллисекунды.Это дает вам даты в октябре 2018 года, когда я буду использовать ваши тестовые данные.

Затем, чтобы сравнить их и исправить оставшиеся проблемы, используйте эту (гораздо более простую) форму:

let sortedData = data.sort((a:any, b:any) => { 
  let bd = objToDate(b.element.updatedOn);
  let ad = objToDate(a.element.updatedOn);
  return ad - bd
});

Это должносделайте это.

Чтобы изменить порядок сортировки, просто используйте оператор less-than:

  return bd - ad
0 голосов
/ 11 октября 2018

Это что-то вроде этого:

var array = [
{id: 1, name:'name1', date: 'Mar 12 2012 10:00:00 AM'},
{id: 2, name:'name2', date: 'Mar 8 2012 08:00:00 AM'}
];

console.log(array.sort((a, b) => {
  return new Date(a.date) - new Date(b.date)
}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...