简体   繁体   English

如何创建对象数组中数量最多的项目的对象图?

[英]How to create an object map of items with the most quantity from array of objects?

New to JavaScript and this is my first post. JavaScript的新手,这是我的第一篇文章。 So I have this array of objects: 所以我有这个对象数组:

  var allOrders = [
        {
            id: 1,
            order: [
                { itemName: "Shoes", quantity: 1 },
                { itemName: "Socks", quantity: 3 },
                { itemName: "Sandals", quantity: 5 },
                { itemName: "Shirts", quantity: 1 },
            ],
        },
        {
            id: 2,
            order: [
                { itemName: "Hats", quantity: 1 },
                { itemName: "Shoes", quantity: 3 },
                { itemName: "Sandals", quantity: 5 },
                { itemName: "Shirts", quantity: 1 },
            ],
        },
 ]

I have done a nested loop to access all the itemName and quantity. 我已经完成了一个嵌套循环来访问所有itemName和数量。

for (let i = 0; i < allOrders.length; i++) {
  let orders = allOrders[i].order

  for (let j = 0; j < orders.length; j++) {
    let itemName = orders[j].itemName;
    let quantity = orders[j].quantity;
  }
}

What I want to do is return some sort of object mapper that will count the total number of quantity for each unique item in descending order like this 我想要做的是返回某种对象映射器,它将按这样的降序计数每个唯一项目的数量总数

{
   Sandals: 10,
   Shoes: 4,
   Socks: 3,
   Shirts: 3,
   Hats: 1
}

Thank you! 谢谢!

Reduce into an object indexed by itemName , then sort its entries to create a sorted object using Object.fromEntries : 化简为一个由itemName索引的对象,然后使用Object.fromEntries对它的条目进行排序以创建一个排序的对象:

 var allOrders = [ { id: 1, order: [ { itemName: "Shoes", quantity: 1 }, { itemName: "Socks", quantity: 3 }, { itemName: "Sandals", quantity: 5 }, { itemName: "Shirts", quantity: 1 }, ], }, { id: 2, order: [ { itemName: "Hats", quantity: 1 }, { itemName: "Shoes", quantity: 3 }, { itemName: "Sandals", quantity: 5 }, { itemName: "Shirts", quantity: 1 }, ], }, ]; const unordered = allOrders.reduce((a, { order }) => { order.forEach(({ itemName, quantity }) => { a[itemName] = (a[itemName] || 0) + quantity; }); return a; }, {}); const ordered = Object.fromEntries( Object.entries(unordered).sort( (a, b) => b[1] - a[1] ) ); console.log(ordered); 

Do keep in mind that object property iteration order is only guaranteed in ES6+ environments if you use certain iteration methods , like Object.getOwnPropertyNames , or Reflect.ownKeys . 请记住,只有在使用某些迭代方法 (例如Object.getOwnPropertyNamesReflect.ownKeys ,才可以在ES6 +环境中保证对象属性的迭代顺序。 (If you use other methods like for..in or Object.keys or Object.entries , the order of the keys is implementation-defined) (如果您使用其他方法(例如for..inObject.keysObject.entries ,则键的顺序由实现定义)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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