简体   繁体   中英

Sorting values in array of objects within array of objects

I'd like to sort through all the itemNames and add all the appropriate quantities together to be able to determine which items were ordered the most.

Here is the array of objects below. I want to try to filter and map through the array of objects and list out the itemName and appropriate totaled quantity for each one, just not sure how to chain together.

function OrderRepository() {

return orderLines.filter((itemName) => {
   orderLines.map((quantity) => {
     return 
  }
 }
}

Provided array of objects

OrderRepository.prototype.getYesterdaysOrders = function getYesterdaysOrders() {
var yesterdaysOrders = [
    {
        id: 1,
        orderLines: [
            { itemName: "Item 01", quantity: 1 },
            { itemName: "Item 02", quantity: 3 },
            { itemName: "Item 03", quantity: 25 },
            { itemName: "Item 04", quantity: 12 },
        ],
    },
    {
        id: 2,
        orderLines: [
            { itemName: "Item 01", quantity: 1 },
            { itemName: "Item 08", quantity: 42 },
            { itemName: "Item 09", quantity: 13 },
            { itemName: "Item 12", quantity: 37 },
        ],
    },
    {
        id: 3,
        orderLines: [
            { itemName: "Item 12", quantity: 16 },
        ],
    },
    {
        id: 4,
        orderLines: [
            { itemName: "Item 10", quantity: 11 },
            { itemName: "Item 11", quantity: 10 },
        ],
    },
    {
        id: 5,
        orderLines: [
            { itemName: "Item 06", quantity: 7 },
            { itemName: "Item 07", quantity: 2 },
            { itemName: "Item 12", quantity: 14 },
        ],
    },
    {
        id: 6,
        orderLines: [
            { itemName: "Item 05", quantity: 17 },
        ],
    },
    {
        id: 7,
        orderLines: [
            { itemName: "Item 03", quantity: 5 },
            { itemName: "Item 07", quantity: 2 },
        ],
    },
    {
        id: 8,
        orderLines: [
            { itemName: "Item 02", quantity: 13 },
            { itemName: "Item 07", quantity: 7 },
            { itemName: "Item 09", quantity: 2 },
        ],
    },
    {
        id: 9,
        orderLines: [
            { itemName: "Item 01", quantity: 4 },
            { itemName: "Item 06", quantity: 17 },
            { itemName: "Item 07", quantity: 3 },
        ],
    },
    {
        id: 10,
        orderLines: [
            { itemName: "Item 11", quantity: 12 },
            { itemName: "Item 12", quantity: 1 },
        ],
    },
 ];

 return yesterdaysOrders;
};

Desired result

{ itemName: "Item 01", quantity: 6 } { itemName: "Item 02", ...... }

I'd like the itemName in order with the totaled quantity listed for that item. So the total number of times Item 01 was ordered yesterday was 6.

You could count the items with the help of a Map and render the wanted result as an array.

 var data = [{ id: 1, orderLines: [{ itemName: "Item 01", quantity: 1 }, { itemName: "Item 02", quantity: 3 }, { itemName: "Item 03", quantity: 25 }, { itemName: "Item 04", quantity: 12 }] }, { id: 2, orderLines: [{ itemName: "Item 01", quantity: 1 }, { itemName: "Item 08", quantity: 42 }, { itemName: "Item 09", quantity: 13 }, { itemName: "Item 12", quantity: 37 }] }, { id: 3, orderLines: [{ itemName: "Item 12", quantity: 16 }] }, { id: 4, orderLines: [{ itemName: "Item 10", quantity: 11 }, { itemName: "Item 11", quantity: 10 }] }, { id: 5, orderLines: [{ itemName: "Item 06", quantity: 7 }, { itemName: "Item 07", quantity: 2 }, { itemName: "Item 12", quantity: 14 }] }, { id: 6, orderLines: [{ itemName: "Item 05", quantity: 17 }] }, { id: 7, orderLines: [{ itemName: "Item 03", quantity: 5 }, { itemName: "Item 07", quantity: 2 }] }, { id: 8, orderLines: [{ itemName: "Item 02", quantity: 13 }, { itemName: "Item 07", quantity: 7 }, { itemName: "Item 09", quantity: 2 }] }, { id: 9, orderLines: [{ itemName: "Item 01", quantity: 4 }, { itemName: "Item 06", quantity: 17 }, { itemName: "Item 07", quantity: 3 }] }, { id: 10, orderLines: [{ itemName: "Item 11", quantity: 12 }, { itemName: "Item 12", quantity: 1 }] }], result = Array.from( data.reduce((m, { orderLines }) => { orderLines.forEach(({ itemName, quantity }) => m.set(itemName, (m.get(itemName) || 0) + quantity)); return m; }, new Map), ([itemName, quantity]) => ({ itemName, quantity }) ); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

This is what you are looking for:

var hashmap = {}
for(var each of yesterdaysOrders) {
    for(var one of each['orderLines']) {
        if (one['itemName'] in hashmap) {
            hashmap[one['itemName']] += one['quantity']
        } else {
            hashmap[one['itemName']] = one['quantity']
        }
    }
}

You can use JavaScript's reduce() method to do that.

let result = yesterdaysOrders.reduce((arr, currentValue) => {
  currentValue.orderLines.forEach(order => {
    const index = arr.findIndex(item => item.itemName === order.itemName);
    if (index === -1) {
      arr.push(order);
    } else {
        arr[index].quantity += order.quantity;
    } 
  });

  return arr;
}, []);

And sort the resultant array using Array.sort() .

// Sorting on item name in ascending order.
result.sort((a, b) => {
    if (a.itemName < b.itemName) {
      return -1;
    } else if (a.itemName > b.itemName) {
        return 1;
    } else {
        return 0;
    }
});

Demo:

 var yesterdaysOrders = [ { id: 1, orderLines: [ { itemName: "Item 01", quantity: 1 }, { itemName: "Item 02", quantity: 3 }, { itemName: "Item 03", quantity: 25 }, { itemName: "Item 04", quantity: 12 }, ], }, { id: 2, orderLines: [ { itemName: "Item 01", quantity: 1 }, { itemName: "Item 08", quantity: 42 }, { itemName: "Item 09", quantity: 13 }, { itemName: "Item 12", quantity: 37 }, ], }, { id: 3, orderLines: [ { itemName: "Item 12", quantity: 16 }, ], }, { id: 4, orderLines: [ { itemName: "Item 10", quantity: 11 }, { itemName: "Item 11", quantity: 10 }, ], }, { id: 5, orderLines: [ { itemName: "Item 06", quantity: 7 }, { itemName: "Item 07", quantity: 2 }, { itemName: "Item 12", quantity: 14 }, ], }, { id: 6, orderLines: [ { itemName: "Item 05", quantity: 17 }, ], }, { id: 7, orderLines: [ { itemName: "Item 03", quantity: 5 }, { itemName: "Item 07", quantity: 2 }, ], }, { id: 8, orderLines: [ { itemName: "Item 02", quantity: 13 }, { itemName: "Item 07", quantity: 7 }, { itemName: "Item 09", quantity: 2 }, ], }, { id: 9, orderLines: [ { itemName: "Item 01", quantity: 4 }, { itemName: "Item 06", quantity: 17 }, { itemName: "Item 07", quantity: 3 }, ], }, { id: 10, orderLines: [ { itemName: "Item 11", quantity: 12 }, { itemName: "Item 12", quantity: 1 }, ], }, ]; let result = yesterdaysOrders.reduce((arr, currentValue) => { currentValue.orderLines.forEach(order => { const index = arr.findIndex(item => item.itemName === order.itemName); if (index === -1) { arr.push(order); } else { arr[index].quantity += order.quantity; } }); return arr; }, []); // Sorting on item name in ascending order. result.sort((a, b) => { if (a.itemName < b.itemName) { return -1; } else if (a.itemName > b.itemName) { return 1; } else { return 0; } }); console.log(result); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM