JavaScript 数组:按 2 组查询数组:卡在 reduce() javascript 问题中

JavaScript Array: Query an array by 2 grouping: stuck in a reduce() javascript problem

我对 reduce() 函数有疑问。

假设我有这个数组:

myOrders = 
  [ { order_date: '2019/12/01', order_type: 'Shoes',  order_amount: 50 } 
  , { order_date: '2019/12/01', order_type: 'Shoes',  order_amount: 30 } 
  , { order_date: '2019/12/01', order_type: 'Shirts', order_amount: 30 } 
  , { order_date: '2019/12/02', order_type: 'Shoes',  order_amount: 10 } 
  ] 

我需要想出如下内容:

    filteredOrders = [
       {
        order_date: '2019/12/01',
        ordered_items: {
           {type: 'Shoes', amount: 80},
           {type: 'Shirts', amount: 30}
        }
      }
    ]

请注意,此过滤后的数组正在查询 date 并通过 typeamount 求和。

我有下面的一段代码,但我无法让它工作,同时考虑到 type

let seriesData = Object.entries(
  buyOperations.reduce(
    (dvs, { order_date: d, order_amount: v }) => 
      ({ ...dvs, [d]: (dvs[d] || 0) + v }), {}
    )
  ).map(([order_date, order_amount]) => ({
      order_date,
      order_amount
  }));

你可以使用reduce方法按order_date分组,然后你可以根据order_type是否已经被推送来对你的元素求和:

myOrders.reduce((a, {order_date, order_type,order_amount})=> {
    a[order_date] = a[order_date] || {order_date, ordered_items: []};

    let order_items = a[order_date].ordered_items.find(s => s.type == order_type);
    if (order_items)
        order_items.amount +=order_amount;
    else
        a[order_date].ordered_items.push({type: order_type, amount: order_amount});

    return a;    
}, {})

一个例子:

let myOrders =  [
        {
            order_date: '2019/12/01',
            order_type: 'Shoes',
            order_amount: 50
        },
        {
            order_date: '2019/12/01',
            order_type: 'Shoes',
            order_amount: 30
        },
        {
            order_date: '2019/12/01',
            order_type: 'Shirts',
            order_amount: 30
        },
        {
            order_date: '2019/12/02',
            order_type: 'Shoes',
            order_amount: 10
        }
    ];    

const result = myOrders.reduce((a, {order_date, order_type,order_amount})=> {
    a[order_date] = a[order_date] || {order_date, ordered_items: []};
    let order_items = a[order_date].ordered_items.find(s => s.type == order_type);
    if (order_items)
        order_items.amount +=order_amount;
    else
        a[order_date].ordered_items.push({type: order_type, amount: order_amount});        
    return a;
}, {})

console.log(`filtered array: `, Object.values(result).filter(f => f.order_date == '2019/12/01'));
console.log(`overall array: `, Object.values(result));

您需要按 dae 和类型进行嵌套分组。此方法对数据使用单个循环,并使用 Array#find 获取相同的组。如果没有找到一个新组插入到同一级别。

var orders = [{ order_date: '2019/12/01', order_type: 'Shoes', order_amount: 50 }, { order_date: '2019/12/01', order_type: 'Shoes', order_amount: 30 }, { order_date: '2019/12/01', order_type: 'Shirts', order_amount: 30 }, { order_date: '2019/12/02', order_type: 'Shoes', order_amount: 10 }],
    grouped = orders.reduce((r, { order_date, order_type, order_amount }) => {
        var date = r.find(q => q.order_date === order_date);
        if (!date) r.push(date = { order_date, ordered_items: [] });
        var type = date.ordered_items.find(q => q.order_type === order_type);
        if (!type) date.ordered_items.push(type = { order_type, order_amount: 0 });
        type.order_amount += order_amount;
        return r;
    }, []);

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }