ReactJS:为唯一食材汇总inputQuantity数值
问题:合并食材数组时正确汇总inputQuantity值
现有食材对象数组:
[ { "id": null, "value": "Apples", "label": "Apples", "Quantity": 1, "Weight": "0.075", "inputQuantity": "2", "Category": "BREAKFAST", "ItemCopy": 2, "PM": "123" }, { "Quantity": 1, "value": "Apples", "Weight": "0.075", "id": null, "label": "Apples", "inputQuantity": "3", "Category": "BREAKFAST", "ItemCopy": 2, "PM": "123" }, { "value": "Asparagus", "id": "TnwiO97ZHCsz4vl9A9OR", "label": "Asparagus", "Weight": "0.185", "Quantity": 1, "inputQuantity": "3", "Category": "BREAKFAST", "ItemCopy": 1, "PM": "123" } ]
原代码尝试按label去重并计算ItemCopy,但汇总后的inputQuantity未正确累加(Apples应为5,Asparagus应为3),原实现代码如下:
function getUniqueDataCount(objArr, propName) { const mi = [...objArr] var data = []; objArr.forEach(function (d, index) { if (d[propName]) { data.push(d[propName]); } }); var uniqueList = [...new Set(data)]; var dataSet = {}; for (var i = 0; i < data.length; i++) { dataSet[uniqueList[i]] = data.filter(x => x == uniqueList[i]).length; mi[i].ItemCopy = data.filter(x => x == data[i]).length } return mi; } useMemo(() => { mydata = getUniqueDataCount(daataa, 'label'); }, [daataa]) useMemo(() => { newCheck = Object.values(mydata?.reduce((acc, cur) => Object.assign(acc, { [cur?.label]: cur }), {})) }, [mydata])
修改方案
直接在reduce阶段完成去重、ItemCopy计数和inputQuantity累加,简化逻辑同时保证计算准确:
const newCheck = useMemo(() => { return Object.values(daataa.reduce((acc, cur) => { const key = cur.label; if (!acc[key]) { // 首次出现该食材时,复制对象并初始化累加值 acc[key] = { ...cur }; acc[key].inputQuantity = parseInt(cur.inputQuantity, 10); acc[key].ItemCopy = 1; } else { // 重复食材累加数量,更新计数 acc[key].inputQuantity += parseInt(cur.inputQuantity, 10); acc[key].ItemCopy += 1; } // 保持inputQuantity为字符串类型(不需要可省略) acc[key].inputQuantity = acc[key].inputQuantity.toString(); return acc; }, {})); }, [daataa]);
逻辑说明
- 用
reduce遍历数组,以label作为分组键 - 首次遇到某类食材时,复制原对象并将
inputQuantity转为数字初始化,同时设置ItemCopy为1 - 遇到重复食材时,累加
inputQuantity数值,同时增加ItemCopy计数 - 可选:将累加后的数值转回字符串,保持与原字段类型一致
- 最后用
Object.values将分组对象转为最终数组
修改后得到的newCheck结果:
[ { "id": null, "value": "Apples", "label": "Apples", "Quantity": 1, "Weight": "0.075", "inputQuantity": "5", "Category": "BREAKFAST", "ItemCopy": 2, "PM": "123" }, { "value": "Asparagus", "id": "TnwiO97ZHCsz4vl9A9OR", "label": "Asparagus", "Weight": "0.185", "Quantity": 1, "inputQuantity": "3", "Category": "BREAKFAST", "ItemCopy": 1, "PM": "123" } ]
内容的提问来源于stack exchange,提问作者Paul VI
相关产品推荐
相关产品推荐

