Как сгруппировать массив объектов?

Есть массив:

[{
  name_product: "Футболка",
  variant: "M",
  product_id: "466",
  order_id: "84957",
  date: "2023-06-13",
  count: 1,
  price: 1990,
  total: 1990
},
{
  name_product: "Футболка 2",
  variant: "XL",
  product_id: "468",
  order_id: "84957",
  date: "2023-06-13",
  count: 1,
  price: 1990,
  total: 1990
},
{
  name_product: "Штаны",
  variant: "",
  product_id: "158",
  order_id: "84994",
  date: "2023-06-13",
  count: 1,
  price: 400,
  total: 400
},
{
  name_product: "Кофта",
  variant: "M",
  product_id: "469",
  order_id: "84992",
  date: "2023-06-14",
  count: 1,
  price: 1990,
  total: 1990
}]

В этом массиве есть два объекта с одинаковым order_id. Надо соединить их в один (сложив total и count) и добавить новый массив item с объектами в нем, например:

[{
  order_id: "84957",
  total: 3980,
  date: "2023-06-13",
  count: 2,
  items: [
    {product_id: "466", variant: "M", count: 1, price: 1990, name_product: "Футболка"},
    {product_id: "468", variant: "XL", count: 1, price: 1990, name_product: "Футболка2"}
  ]
},
{
  order_id: "84994",
  total: 400,
  date: "2023-06-13",
  count: 1,
  items: [
    {product_id: "158", variant: "", count: 1, price: 400, name_product: "Штаны"}
  ]
},
{
  order_id: "84992",
  total: 1990
  date: "2023-06-14",
  count: 1,
  items: [
    {product_id: "469", variant: "M", count: 1, price: 1990, name_product: "Кофта"}
  ]
}]

Прочитал про .reduce(), вроде как можно это выполнить через него. Но не понимаю как.
  • Вопрос задан
  • 112 просмотров
Решения вопроса 1
kokorinleks
@kokorinleks Автор вопроса
Благодаря ChatGPT разобрался! Оказалось все куда проще. Вдруг кому будет полезно :)
const orders = SaleOrder.reduce((acc, item) => {
    const orderId = item.order_id;
    if (!acc[orderId]) {
      acc[orderId] = {
        orderId: orderId,
        date: item.date,
        products: [],
        count: 0, // добавляем переменную count
        total: 0, // добавляем переменную total
      };
    }
    acc[orderId].products.push({
      name: item.name_product,
      variant: item.variant,
      productId: item.product_id,
      count: item.count,
      price: item.price,
      total: item.total,
    });
    acc[orderId].count += item.count; // добавляем count
    acc[orderId].total += item.price; // добавляем total
    return acc;
  }, {});

  const ordersArray = Object.values(orders);
  console.log(ordersArray);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы