Сортировать объект по дочернему значению с помощью lodash - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть следующий объект:

const object = {
  "9c8vDTruRDPi937aHMMz":{
    name: "item1",
    createdAt: {
      seconds: 1582227276, 
      nanoseconds: 68000000
    }
  },
  "rAexYu2rAz0AEnD77x5p":{
    name: "item2",
    createdAt: {
      seconds: 1582227577,
      nanoseconds: 922000000
    }
  }
}

И я хотел бы отсортировать его в зависимости от созданного атрибута.seconds и сохранить его как объект.

Например, возвращаемое значение будет (если сортировка зависит от секунд и Des c):

const sortedByDateObject = {
  "rAexQu3rdm0AEnD77x5p":{
    name: "item2",
    createdAt: {
      seconds: 1582227577,
      nanoseconds: 922000000
    }
  },
  "9c8vDGryRSZi817aHMMz":{
    name: "item1",
    createdAt: {
      seconds: 1582227276, 
      nanoseconds: 68000000
    }
  }
}

Знайте, как сортировать массивы с помощью loda sh, но не такого рода сложную задачу с вложенными объектами.

Любая помощь очень ценится:)

1 Ответ

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

Это превратит ваш объект в массив, который можно правильно отсортировать (как указывает @Taki, порядок свойств объекта не гарантируется).

const object = {
  "9c8vDTruRDPi937aHMMz":{
    name: "item1",
    createdAt: {
      seconds: 1582227276, 
      nanoseconds: 68000000
    }
  },
  "rAexYu2rAz0AEnD77x5p":{
    name: "item2",
    createdAt: {
      seconds: 1582227577,
      nanoseconds: 922000000
    }
  }
};

const orderedArray = _.chain(object)
  .toPairs()
  .map(([key, ...obj]) => ({
    key,
    ...obj[0],
    createdAtSeconds: obj[0].createdAt.seconds
  }))
  .orderBy(['createdAtSeconds'], ['desc'])
  .map(({ createdAtSeconds, ...obj }) => obj)
  .value()
  
console.log(orderedArray);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...