繁体   English   中英

如何使用嵌套数组对对象中的值求和?

[英]How to sum values in object with nested arrays?

我有以下结构:

groupedData = {
   rice: [
     {
       name: 'white rice'
       quantity: 2
       category: 'rice'
     },
     {
      name: 'brown rice'
      quantity: 1
      category: 'rice'
    }
   ],
   water: [
     {
       name: 'sparkle water'
       quantity: 1
       category: 'water'
     },
     {
      name: 'still water'
      quantity: 1
      category: 'water'
    }
   ],
   tea: [{
       name: 'green tea'
       quantity: 1
       category: 'water'
   }],
 }

我想要实现的是每个类别的总和数量,例如:米:3,水:2,茶:1

我尝试了以下方法:

  const sum = () => {
    let quantity = []
    for (var property in groupedData) {
      for (let i=0; i< groupedData[property].length; i++){
      quantity[property] = groupedData[property][i].quantity;
      }
    }
    return quantity;
}

但它不返回汇总数据,而只返回第一项的数量[rice: 2, water: 1, tea: 1]

您的解决方案不会添加节点。 只需添加每个节点的quantity

 const groupedData = { rice: [ { name: 'white rice', quantity: 2, category: 'rice' }, { name: 'brown rice', quantity: 1, category: 'rice' } ], water: [ { name: 'sparkle water', quantity: 1, category: 'water' }, { name: 'still water', quantity: 1, category: 'water' } ], tea: [ { name: 'green tea', quantity: 1, category: 'water' }], }; const sum = () => { let quantity = {} for (var property in groupedData) { for (let i = 0; i < groupedData[property].length; i++) { quantity[property] = quantity[property] ? quantity[property] : 0; quantity[property] += groupedData[property][i].quantity; } } return quantity; }; console.log(sum());

您还可以使用Object.entriesArray.forEachArray.reduce来实现这一点。

 const groupedData = { rice: [ { name: 'white rice', quantity: 2, category: 'rice' }, { name: 'brown rice', quantity: 1, category: 'rice' } ], water: [ { name: 'sparkle water', quantity: 1, category: 'water' }, { name: 'still water', quantity: 1, category: 'water' } ], tea: [ { name: 'green tea', quantity: 1, category: 'water' }], }; const sum = () => { let quantity = {}; Object.entries(groupedData).forEach(([key, value]) => { quantity[key] = value.reduce((acc, { quantity }) => acc += quantity, 0) }); return quantity; }; console.log(sum());

这是基于你的问题。

 const groupedData = { rice: [{ name: 'white rice', quantity: 2, category: 'rice', }, { name: 'brown rice', quantity: 1, category: 'rice', } ], water: [{ name: 'sparkle water', quantity: 1, category: 'water', }, { name: 'still water', quantity: 1, category: 'water', } ], tea: [{ name: 'green tea', quantity: 1, category: 'water', }], } const sum = () => { let quantity = {} for (var property in groupedData) { for (let i = 0; i < groupedData[property].length; i++) { quantity = { ...quantity, [property]: quantity[property] ? quantity[property] + groupedData[property][i].quantity : groupedData[property][i].quantity } } } return quantity; } console.log(sum());

这是我对 reduce 的回答

 const groupedData = { rice: [{ name: 'white rice', quantity: 2, category: 'rice', }, { name: 'brown rice', quantity: 1, category: 'rice', } ], water: [{ name: 'sparkle water', quantity: 1, category: 'water', }, { name: 'still water', quantity: 1, category: 'water', } ], tea: [{ name: 'green tea', quantity: 1, category: 'water', }], } const sum = () => { let res = {} for (var props in groupedData) { const item = groupedData[props].reduce((acc, cur) => { acc += cur.quantity; return acc; }, 0); res[props] = item; } return res; } console.log(sum());

你可以这样做:

const result = Object.entries(groupedData).reduce((prev, [k, v]) => {
  const sums = {
    ...prev,
    [k]: v.reduce((p, c) => p + c.quantity, 0),
  }
  return sums
}, {})

这是完整的片段:

 const groupedData = { rice: [{ name: 'white rice', quantity: 2, category: 'rice', }, { name: 'brown rice', quantity: 1, category: 'rice', }, ], water: [{ name: 'sparkle water', quantity: 1, category: 'water', }, { name: 'still water', quantity: 1, category: 'water', }, ], tea: [{ name: 'green tea', quantity: 1, category: 'water', }, ], } const result = Object.entries(groupedData).reduce((prev, [k, v]) => { const sums = { ...prev, [k]: v.reduce((p, c) => p + c.quantity, 0), } return sums }, {}) console.log(result)

并且作为单班轮......

  var result = Object.keys(groupedData).reduce((prev, key) => ({...prev,[key]: groupedData[key].reduce((total,item)=>total+item.quantity,0)}),{});
  console.log(result);

使用 Object.entries 可能更具可读性

  var result2 = Object.entries(groupedData).reduce((prev, [k, v]) => ({...prev, [k]: v.reduce((total,item)=>total+item.quantity,0)}),{});
  console.log(result2);

暂无
暂无

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

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