按对象和聚合重复的Javascript键数组

时间:2017-09-29 12:37:05

标签: javascript arrays object reduce

我检索一个以数组[Orders]形式返回的订单对象列表,此列表可以是任意大小。每个订单对象的结构如下。我试图从订单中提取客户本质上是一个关键,并将每个客户的订单分组。

order: {
 details: {
   price: ""
 }
 customer: {
   name: "blah blah"
   email: "blah@gmail.com"
 }
} 

我需要弄清楚将每个订单分组到特定客户的最佳方式。确保如果为同一客户返回多个订单,则忽略重复,并仍然将订单添加到属于每个客户的阵列。理想的输出是

customer: {
  name: "Blah Blah",
  email: "blah@gmail.com",
  orders: [Orders]
}

1 个答案:

答案 0 :(得分:1)

这可能是通过搜索堆栈溢出来找到如何对一组项目进行分组而找到的,并且可能是重复的......

但是,假设你想通过电子邮件对客户进行分组,这样的事情对你有用。

var result = orders.reduce(customers, order => {
    // comparing customers by email
    var customer = customers.find(c => c.email === order.customer.email);

    if (!customer) {
        customer = {
            name: order.customer.name,
            email: order.customer.email,
            orders: [ order ]
        };
        // or use spread syntax, if you have that available
        // customer = { ...order.customer, orders: [ order ] }
        customers.push(customer);
    } else {
        customer.orders.push(order);
    }
}, []);