Несколько групп и сумБи в массиве объектов с использованием Lodash

#javascript #arrays #object #lodash #nivo-react

Вопрос:

У меня есть следующие данные:

 const rawData=[
  {
    Order_Date: "2020-08-11",
    Region: "South",
    Product_Name: "Bookcase",
    Sales: 261.96
  },
  {
    Order_Date: "2020-08-13",
    Region: "South",
    Product_Name: "Stacking Chairs",
    Sales: 731.94
  },
  {
    Order_Date: "2020-10-06",
    Region: "South",
    Product_Name: "Stacking Chairs",
    Sales: 700.45
  },
  {
    Order_Date: "2020-12-06",
    Region: "East",
    Product_Name: "Self-Adhesive Address Labels for Typewriters by Universal",
    Sales: 14.62
  },
  {
    Order_Date: "2019-11-15",
    Region: "East",
    Product_Name: "Table",
    Sales: 957
  },
  {
    Order_Date: "2019-11-10",
    Region: "East",
    Product_Name: "Eldon Fold",
    Sales: 22
  }
]
 

Ожидаемые результаты:

 [
    {
      Region: "South",
      data: [
        {
           Order_Date: "2020-08",
           Sales: 993.90
        },
        {
          Order_Date: "2020-10",
          Sales: 700.45
        },
      ]
    },
    {
      Region: "East",
      data: [
        {
           Order_Date: "2019-11",
           Sales: 989
        },
        {
          Order_Date: "2020-12",
          Sales: 14.62
        },
      ]
    }
]
 

Я хочу сначала сгруппировать по регионам, и для каждого региона я хочу сгруппировать по годам и месяцам («ГГГГ-ММ») даты заказа и суммы по продажам для каждой группы даты заказа («ГГГГ-ММ»).

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

 const groupByRegion = _(rawData).groupBy('Region').value();

const groupByRegionDate = _.forEach(groupByRegion, (value, key) => {
        groupByRegion[key] = _.groupBy(groupByRegion[key], (item) =>
            moment(item.Order_Date).startOf('month').format('YYYY-MM')
        );
    });

 

Комментарии:

1. rawData не может быть «JSON», так как JSON-это текстовый формат. Следовательно, этот вопрос касается массивов и объектов, а не JSON, так что давайте оставим его в стороне, не так ли?

2. Я бы просто использовал item.Order_Date.slice(0, -3) , а не анализировал дату с моментом.

Ответ №1:

 let data = [{ "Order_Date": "2020-08-11", "Region": "South", "Product_Name": "Bookcase", "Sales": 261.96 }, { "Order_Date": "2020-08-11", "Region": "South", "Product_Name": "Stacking Chairs", "Sales": 731.94 }, { "Order_Date": "2020-10-06", "Region": "South", "Product_Name": "Stacking Chairs", "Sales": 700.45 }, { "Order_Date": "2020-12-06", "Region": "East", "Product_Name": "Typewriters by Universal", "Sales": 14.62 }, { "Order_Date": "2019-11-10", "Region": "East", "Product_Name": "Table", "Sales": 957 }, { "Order_Date": "2019-11-10", "Region": "East", "Product_Name": "Eldon Fold", "Sales": 22 }]
let results = []

for (let item of data) {
    let { Region, Order_Date, Sales } = item;
    let group = results.find(v => v.Region == Region);
    if (!group) results.push(group = { Region, data: [] });

    let groupItem = group.data.find(v => v.Order_Date == Order_Date);

    if (!groupItem)
        group.data.push({ Order_Date, Sales })
    else
        groupItem.Sales  = Sales;
}

console.log(results) 

Комментарии:

1. Очень близко к ожидаемому результату. Спасибо за ваш ответ.

2. Конечно, это не на 100% так, как вы ожидали, Потому что я намеренно не ответил на 100% И оставил некоторые задачи для вас (как практика)…