JavaScript Массив: запрос массива по 2 группам: застрял в редукции () javascript проблема - PullRequest
0 голосов
/ 07 января 2020

У меня проблема с функцией redu ().

Предположим, у меня есть этот массив:

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 и суммирует amount на type.

У меня есть фрагмент кода ниже, но я не могу сделать это работает с учетом 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
  }));

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Вам нужна вложенная группировка по типу и типу. Этот подход использует один l oop для данных и 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; }
0 голосов
/ 07 января 2020

Вы можете использовать метод 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));
...