javascript - 对数组中的数据进行分组

标签 javascript arrays

我有一个包含不同对象的数组,其中每个对象都是一个订单。 看起来像这样:

array = [
    {
    doc : {
      date: "2017-03-06T16:48:23.080Z",
      products:[
        {
          product: "Product 1",
          number: 3
        },
        {
          product: "Product 2",
          number: 2
        }
      ]
    }
  },
  {
    doc : {
      date: "2017-03-07T16:48:23.080Z",
      products:[
        {
          product: "Product 2",
          number: 10
        },
        {
          product: "Product 3",
          number: 1
        }
      ]
    }
  }
]

我希望能够获取这些数据并将其推送到新数组中,其中每个数组都有一个日期属性(按日期分组)和一个产品嵌套数组,该数组对不同的订单进行分组(按产品分组)。像这样:

array = [
    {
       date: 'Date X',
       products: [
         {
          product: 'product 1',
          units: 3
         },
         {
          product: 'product 2',
          units: 2
         }
      ]    
    },
    {
       date: 'Date Y',
       products: [
         {
          product: 'product 2',
          units: 10
         },
         {
          product: 'product 3',
          units: 1
         }

      ]
    }
]

你会如何处理这个问题?到目前为止,我已经尝试使用 Lodash 尝试重用一些旧代码,但没有成功。可以用 forEach 来完成吗?

最佳答案

使用 lodash 和 ES6 的解决方案:

// Remove unnecesary .doc properties
let arrayWithoutDoc = _.map(array, el => el.doc);

// Group by dates to single object
let grouped = _.groupBy(arrayWithoutDoc, el => el.date);

// Convert object to requested format
let result = _.map(grouped, (value, date) => ({
    date: date,
    products: sumProductsUnits(
        _.flatMap(value, el => el.products)
    )
}));

// Function for grouping unique products with sum of units
function sumProductsUnits(products) {
    var productGroups = _.groupBy(products, productObj => productObj.product);

    return _.map(productGroups, (productGroup, productName) => ({
        product: productName,
        units: productGroup.reduce((sum, val) => sum + val.number, 0)
    }))
}

我假设 units 等于原始对象中的 number

result 包含:

[
   {
      "date":"2017-03-06T16:48:23.080Z",
      "products":[
         {
            "product":"Product 1",
            "units":3
         },
         {
            "product":"Product 2",
            "units":2
         }
      ]
   },
   {
      "date":"2017-03-07T16:48:23.080Z",
      "products":[
         {
            "product":"Product 2",
            "units":10
         },
         {
            "product":"Product 3",
            "units":1
         }
      ]
   }
]

关于javascript - 对数组中的数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42610343/

相关文章:

javascript - 如何使用扩展语法删除第一个数组元素

javascript - nodejs reactjs 和 webpack,配置错误但是什么?

javascript - 使用 jquery 更改 id attr 的值

arrays - 元组/数组对列表

c++ - 由于 ID3D11Buffer 而导致访问冲突

c - 在函数声明中引用结构类型?

javascript - Google Apps 脚本返回 null

javascript - 有没有可能将 postgreSQL 直接连接到 Javascript?

java - 如何将内部没有可序列化字段的java对象序列化为字节数组并反序列化该数组以获得原始对象

C++ 动态/静态数组作为函数的参数