Javascript ES6分组和总和的实施

Javascript ES6分组和总和的实施,javascript,ecmascript-6,Javascript,Ecmascript 6,我有一个具有以下属性的对象数组:材质编号、材质名称、数量 let data = [ { material_no: '1001', material_name: 'Material 1', qty: 100 }, { material_no: '1001', material_name: 'Material 1', qty: 50 }, { material_no: '1002', material_name: 'Material 2', qty: 44 }, { material

我有一个具有以下属性的对象数组:材质编号、材质名称、数量

let data = [
  { material_no: '1001', material_name: 'Material 1', qty: 100 },
  { material_no: '1001', material_name: 'Material 1', qty: 50 },
  { material_no: '1002', material_name: 'Material 2', qty: 44 },
  { material_no: '1003', material_name: 'Material 3', qty: 125 },
  { material_no: '1002', material_name: 'Material 2', qty: 59 },
  { material_no: '1004', material_name: 'Material 4', qty: 999 },
  { material_no: '1005', material_name: 'Material 5', qty: 80 },
  { material_no: '1005', material_name: 'Material 5', qty: 66 }
]
如何返回按其物料编号/物料名称分组的对象数组以及具有相同物料编号/物料名称的数量总和

[
  { material_no: '1001', material_name: 'Material 1', qty: 150 },
  { material_no: '1002', material_name: 'Material 2', qty: 103 },
  { material_no: '1003', material_name: 'Material 3', qty: 125 },
  { material_no: '1004', material_name: 'Material 4', qty: 999 },
  { material_no: '1005', material_name: 'Material 5', qty: 146 }
]

您可以将数组简化为一个
映射
,该映射按
物料编号
存储所有项目。然后将映射值提取到数组

let数据=[
{物料编号:“1001”,物料名称:“物料1”,数量:100},
{材料编号:“1001”,材料名称:“材料1”,数量:50},
{材料编号:“1002”,材料名称:“材料2”,数量:44},
{材料编号:“1003”,材料名称:“材料3”,数量:125},
{材料编号:“1002”,材料名称:“材料2”,数量:59},
{材料编号:“1004”,材料名称:“材料4”,数量:999},
{材料编号:“1005”,材料名称:“材料5”,数量:80},
{材料编号:“1005”,材料名称:“材料5”,数量:66}
]
常数和=[
…数据.reduce(
(地图,项目)=>{
常数{物料编号:键,数量}=物料;
const prev=map.get(键);
如果(上一个){
上一数量+=数量
}否则{
map.set(key,Object.assign({},item))
}
返回图
},
新地图()
).values()
]
console.log(总和)
它很慢,只是为了好玩:)

你可以像这样使用
.reduce()

let data=[{材料编号:1001',材料名称:材料1',数量:100},{材料编号:1001',材料名称:材料1',数量:50},{材料编号:1002',材料名称:材料2',数量:44},{材料编号:1003',材料名称:材料3',数量:125},{材料编号:1002',材料名称:材料2',数量:59},{物料编号:'1004',物料名称:'物料4',数量:999},{物料编号:'1005',物料名称:'物料5',数量:80},{物料编号:'1005',物料名称:'物料5',数量:66};
让结果=Object.values(
数据减少((a,c)=>(
a[c.材料编号]=a[c.材料编号]?
(a[c.物料编号]。数量+=c.数量,a[c.物料编号]:
c、 a),{}
)
);
console.log(结果);
.as控制台包装{最大高度:100%!重要;顶部:0;}
让数据=[
{物料编号:“1001”,物料名称:“物料1”,数量:100},
{材料编号:“1001”,材料名称:“材料1”,数量:50},
{材料编号:“1002”,材料名称:“材料2”,数量:44},
{材料编号:“1003”,材料名称:“材料3”,数量:125},
{材料编号:“1002”,材料名称:“材料2”,数量:59},
{材料编号:“1004”,材料名称:“材料4”,数量:999},
{材料编号:“1005”,材料名称:“材料5”,数量:80},
{材料编号:“1005”,材料名称:“材料5”,数量:66}
];
让累加=数据。减少((总计、val、索引)=>{
让foundItemIndex=total.findIndex((obj)=>obj.material\u no==val.material\u no);
如果(foundItemIndex<0)总推送(val)
else总计[foundItemIndex]。数量+=价值数量;
返回总数;
}, []);
控制台日志(累积);

到目前为止,您尝试过什么吗?您能提供示例数据和预期输出吗?@nem035我添加了示例和预期输出。我不得不选择是使用filter、map、reduce还是Object.assign。这太棒了!
data
    .sort((a, b) => a.material_no - b.material_no)
    .map(({material_no, material_name, qty}, index, arr) => ({
        material_no,
        material_name,
        qty: qty + (material_no === (arr[index - 1] || {}).material_no && arr[index - 1].qty)
    }))
    .filter(({material_no}, index, arr) => material_no !== (arr[index + 1] || {}).material_no);
let data = [
  { material_no: '1001', material_name: 'Material 1', qty: 100 },
  { material_no: '1001', material_name: 'Material 1', qty: 50 },
  { material_no: '1002', material_name: 'Material 2', qty: 44 },
  { material_no: '1003', material_name: 'Material 3', qty: 125 },
  { material_no: '1002', material_name: 'Material 2', qty: 59 },
  { material_no: '1004', material_name: 'Material 4', qty: 999 },
  { material_no: '1005', material_name: 'Material 5', qty: 80 },
  { material_no: '1005', material_name: 'Material 5', qty: 66 }
];

let accumulation = data.reduce((total, val, index)=>{
  let foundItemIndex = total.findIndex((obj)=>obj.material_no == val.material_no);
  if(foundItemIndex < 0) total.push(val) 
  else total[foundItemIndex].qty += val.qty;
  return total;
}, []);

console.log(accumulation);