объект сортируется, но его ключи не сохраняются с использованием loda sh sortBy - PullRequest
3 голосов
/ 14 июля 2020

Контекст

Необходимо отсортировать следующие объекты по readingDate с использованием loda sh, я могу отсортировать его, но его индексы не сохраняются.

Оригинал JSON Объект

{
    "Inventory Creation": [
      {
        "id": 150,
        "reading": "12345",
        "readingDate": "2020-07-14"
      }
    ],
    "Inventory & Check-in": [
      {
        "id": 151,
        "reading": "12345",
        "readingDate": "2020-11-14"
      }
    ],
    "Check-in": [
      {
        "id": 152,
        "reading": "12345",
        "readingDate": "2020-08-14"
      }
    ]
}

Код, который я пробовал

_.sortBy(unsorted, o => o[0].readingDate).reverse();

здесь unsorted содержит вышеуказанное Исходный JSON объект

Фактический результат (что я получаю)

{
    0: [
      {
        "id": 151,
        "reading": "12345",
        "readingDate": "2020-11-14"
      }
    ],
    1: [
      {
        "id": 152,
        "reading": "12345",
        "readingDate": "2020-08-14"
      }
    ],
    2: [
      {
        "id": 150,
        "reading": "12345",
        "readingDate": "2020-07-14"
      }
    ]
}

Ожидаемый результат (что я хочу)

{
    "Inventory & Check-in": [
      {
        "id": 151,
        "reading": "12345",
        "readingDate": "2020-11-14"
      }
    ],
    "Check-in": [
      {
        "id": 152,
        "reading": "12345",
        "readingDate": "2020-08-14"
      }
    ],
    "Inventory Creation": [
      {
        "id": 150,
        "reading": "12345",
        "readingDate": "2020-07-14"
      }
    ]
}

Ответы [ 3 ]

3 голосов
/ 14 июля 2020

Вот шаги:

  • преобразовать объект в список пар ключ-значение (_.toPairs() или встроенные Object.entries())
  • отсортировать список
  • преобразовать список пар ключ-значение обратно в объект (_.fromPairs() или встроенные Object.fromEntries())

Нижеприведенный фрагмент может вам помочь. Я использую _.chain() для лучшей читаемости

const data = {
  "Inventory Creation": [
    {
      id: 150,
      reading: "12345",
      readingDate: "2020-07-14",
    },
  ],
  "Inventory & Check-in": [
    {
      id: 151,
      reading: "12345",
      readingDate: "2020-11-14",
    },
  ],
  "Check-in": [
    {
      id: 152,
      reading: "12345",
      readingDate: "2020-08-14",
    },
  ],
}

const res = _.chain(data)
  .toPairs()
  .sortBy((p) => p[1][0].readingDate)
  .reverse()
  .fromPairs()
  .value()

console.log(res)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.19/lodash.min.js"></script>
2 голосов
/ 14 июля 2020

Это комбинация коллекций / массивов. Посмотрите на функцию loda sh, которую вы используете, и на то, для чего она используется. Это не сработает, вы пытаетесь использовать функцию-массив объекта. Функция делает именно то, что должна, сортируя массив. Но нет способа создать отсортированный объект таким образом, он (имеется в виду функция loda sh) даже не знает об объекте.

Сказав это, вот рабочее решение (см. map / reduce в общем):

const entries = Object.entries(unsortedArr);
const sorted = entries.sort((a,b) => a[1][0].readingDate < b[1][0].readingDate ? 1 : -1);
const reduced = sorted.reduce(
  (acc, obj) => {
    acc[obj[0]] = obj[1]
return acc},{});

Of c вы можете связать эти вызовы, но я постарался сделать это более понятным. Я только что наткнулся на groupBy , который тоже можно использовать.

1 голос
/ 14 июля 2020

Вот решение грубой силы. Сначала отсортируйте массив, а также сохраните ключи. Затем сформируйте массив с ключами из sortedArray.

var sortedArray = _.sortBy(unsortedArray, function(val, key){
    val[0].key = key;
    return val[0].readingDate;
}).reverse();

var sortedArrayWithIndex = {};

_.each(sortedArray, function(val){
    var key = val[0].key;
    delete val[0].key;
    sortedArrayWithIndex[key] = val;
});
console.log(sortedArrayWithIndex);
...