Как упорядочить по нескольким свойствам даты и времени с нулями в последний раз? - PullRequest
0 голосов
/ 02 октября 2018

У меня есть json, и я хочу заказать этот json по нескольким свойствам даты и времени.Но есть свойство pinnedAt, которое указывает, что сообщение должно быть сверху.Я использую lodash, кстати.

Это документ SQL, что я пытаюсь объяснить:

Если указано NULLS LAST, нулевые значения сортируются после всех ненулевых значений;если указано NULLS FIRST, нулевые значения сортируются перед всеми ненулевыми значениями.Если ни то, ни другое не указано, поведение по умолчанию равно NULLS LAST, когда ASC указан или подразумевается, и NULLS FIRST, если указано DESC (таким образом, по умолчанию действует так, как если бы значения NULL были больше, чем значения NULL).Если указано ИСПОЛЬЗОВАНИЕ, порядок нуля по умолчанию зависит от того, является ли оператор оператором меньше или больше.

Подробнее можно прочитать здесь: https://www.postgresql.org/docs/9.0/static/sql-select.html


Итак, вот мои примеры данных:

{
  "data": [
    {
      "name": "Paris",
      "createdAt": "2018-10-01T08:28:05.074Z",
      "pinnedAt": null
    },
    {
      "name": "New York",
      "createdAt": "2018-10-01T05:16:05.074Z",
      "pinnedAt": null
    },
     {
      "name": "Washington",
      "createdAt": "2018-10-02T08:28:05.074Z",
      "pinnedAt": "2018-10-02T15:19:23.245Z"
    }
  ]
}

Мой код на заказ

posts = _.orderBy(state.posts, ['pinnedAt', 'createdAt'], ['desc', 'desc']);

Но этот порядок не такой, как я хочу.Вот что я ожидал

{
  "data": [
    {
      "name": "Washington",
      "createdAt": "2018-10-02T08:28:05.074Z",
      "pinnedAt": "2018-10-02T15:19:23.245Z"
    },
    {
      "name": "Paris",
      "createdAt": "2018-10-01T08:28:05.074Z",
      "pinnedAt": null
    },
    {
      "name": "New York",
      "createdAt": "2018-10-01T05:16:05.074Z",
      "pinnedAt": null
    }
  ]
}

Как я могу это сделать?

Спасибо.

1 Ответ

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

Вы можете использовать пользовательскую функцию для обработки null как другого значения, которое будет правильно сортироваться.

const data = [
    {
      "name": "Paris",
      "createdAt": "2018-10-01T08:28:05.074Z",
      "pinnedAt": null
    },
    {
      "name": "New York",
      "createdAt": "2018-10-01T05:16:05.074Z",
      "pinnedAt": null
    },
    {
      "name": "Washington",
      "createdAt": "2018-10-02T08:28:05.074Z",
      "pinnedAt": "2018-10-02T15:19:23.245Z"
    }
]; 

const result = _.orderBy(data, 
                         [(item) => item.pinnedAt ? item.pinnedAt : "", 'createdAt'], 
                         ['desc', 'desc']);

Протестировано с использованием lodash версии 4.17.11 с использованием https://npm.runkit.com/lodash


Это работает, потому что пустая строка «меньше» любого другого строкового значения.При сортировке по убыванию это всегда будет отображаться в конце списка.Поскольку эти пустые строковые значения эквивалентны, объекты без pinnedAt будут отсортированы на основе createdAt, как и ожидалось.

...