Правильное структурирование массива с loda sh groupBy - PullRequest
0 голосов
/ 17 января 2020

У меня есть объект, который выглядит следующим образом:

{
    data: [
        { id: "1", state: "accepted", estimate_date: "2019-12-17" },
        { id: "2", state: "rejected", estimate_date: "2019-12-17" },
        { id: "3", state: "open", estimate_date: "2019-12-17" },
        { id: "4", state: "open", estimate_date: "2019-12-18" },
        { id: "5", state: "rejected", estimate_date: "2019-12-18" },
        { id: "6", state: "accepted", estimate_date: "2019-12-18" },
    ]
}

Когда я использую loda sh groupBy для объекта, подобного этому:

const key = 'data';
const groupedEstimates = groupBy(estimateData[key], 'estimate_date');

Возвращает:

[
  [
    "2019-12-17"
  ],
  [
      [ { id: "1", state: "accepted" } ],
      [ { id: "2", state: "rejected" } ],
      [ { id: "3", state: "open" } ]
  ]
],

[
  [
    "2019-12-18"
  ],
  [
      [ { id: "4", state: "open" } ],
      [ { id: "5", state: "rejected" } ],
      [ { id: "6", state: "accepted" } ]
  ]
]

Но сейчас я пытаюсь добиться чего-то подобного:

[
  {
    date: "2019-12-17",
    items: [
      { id: "1", state: "accepted" },
      { id: "2", state: "rejected" },
      { id: "3", state: "open" },
    ]
  },
  {
    date: "2019-12-18",
    items: [
      { id: "4", state: "open" },
      { id: "5", state: "rejected" },
      { id: "6", state: "accepted" },
    ]
  }
]

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

1 Ответ

1 голос
/ 17 января 2020

После группировки по свойству estimate_date итерируйте объект groups с _.map(). Создайте объект группы, взяв ключ (2-й параметр) для свойства date и сопоставив items с пропуском estimate_date:

const estimateData = {"data":[{"id":"1","state":"accepted","estimate_date":"2019-12-17"},{"id":"2","state":"rejected","estimate_date":"2019-12-17"},{"id":"3","state":"open","estimate_date":"2019-12-17"},{"id":"4","state":"open","estimate_date":"2019-12-18"},{"id":"5","state":"rejected","estimate_date":"2019-12-18"},{"id":"6","state":"accepted","estimate_date":"2019-12-18"}]}

const groupedEstimates = _.map(
  _.groupBy(estimateData.data, 'estimate_date'),
  (items, date) => ({
    date,
    items: items.map(o => _.omit(o, 'estimate_date'))
  })
)

console.log(groupedEstimates)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
...