2

Please help me with my collection i want sum qty the same itemId and type bundle, and with parentId with type Sale_Order like my collection below.

`let item = [{
    id: '001',
    name: 'A',
    qty: 10,
    type:'bundle'        
  },
  {
    id: '002',
    name: 'B',
    qty: 5,
    parentId: '001'
    type:'Sale_Order'
  },
  {
    id: '002',
    name: 'B',
    qty: 4,
    parentId: '001'
    type:'Sale_Order'
  },
  {
    id: '003',
    name: 'C',
    qty: 8,
    parentId: '001'
    type:'Sale_Order'
  },
  {
    id: '001',
    name: 'A',
    qty: -5,
    type:'bundle'
  },
  {
    id: '002',
    name: 'B',
    qty: -5,
    parentId: '001'
    type:'Sale'
  },
  {
    id: '002',
    name: 'B',
    qty: -4,
    parentId: '001'
    type:'Sale'
  },
  {
    id: '003',
    name: 'C',
    qty: -8,
    parentId: '001'
    type:'Sale'
  }
]`

I want my collection like that. you can see the same itemId with type bundle sum qty and another item with parenId form bundle itemId with type only Sale_Order.

 `let item = [{
    id: '001',
    name: 'A',
    qty: 5,
    type:'bundle'        
  },
  {
    id: '002',
    name: 'B',
    qty: 5,
    parentId: '001'
    type:'Sale_Order'
  },
  {
    id: '002',
    name: 'B',
    qty: 4,
    parentId: '001'
    type:'Sale_Order'
  },
  {
    id: '003',
    name: 'C',
    qty: 8,
    parentId: '001'
    type:'Sale_Order'
  },`
Aneat Tea
  • 95
  • 6

1 Answers1

0

You could check first for the objects with parentId and push only the types with 'Sale_Order'.

Then check if an item exists with same id and same type and if found update qty or push a copy of the actual object to the result set.

var items = [{ id: '001', name: 'A', qty: 10, type: 'bundle' }, { id: '002', name: 'B', qty: 5, parentId: '001', type: 'Sale_Order' }, { id: '002', name: 'B', qty: 4, parentId: '001', type: 'Sale_Order' }, { id: '003', name: 'C', qty: 8, parentId: '001', type: 'Sale_Order' }, { id: '001', name: 'A', qty: -5, type: 'bundle' }, { id: '002', name: 'B', qty: -5, parentId: '001', type: 'Sale' }, { id: '002', name: 'B', qty: -4, parentId: '001', type: 'Sale' }, { id: '003', name: 'C', qty: -8, parentId: '001', type: 'Sale' }],
    result = items.reduce((r, o) => {
        if (o.parentId) {
            if (o.type === 'Sale_Order') {
                r.push(o);
            }
            return r;
        }
        let item = r.find(({ id, type }) => o.id === id && o.type === type);
        if (item) {
            item.qty += o.qty;
        } else {
            r.push(Object.assign({}, o));
        }
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392