不使用find与箭头函数 用reducer累加对象数组相同属性值
兼容旧设备的实现方案
你可以把find方法替换为普通的for循环遍历查找匹配项,所有语法均采用ES5规范,无需依赖新的数组方法和箭头函数,即可实现相同的聚合效果:
var data = [ { DishName: '35. Chicken Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0 }, { DishName: '36. Lamb Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0 }, { DishName: '37. Prawn Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0 }, { DishName: '38. King Prawn Vindaloo', Qty: 1, Cooked: 1, NotCooked: 0 }, { DishName: '35. Chicken Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1 }, { DishName: '36. Lamb Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1 }, { DishName: '37. Prawn Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1 }, { DishName: 'Chicken Tikka Vindaloo', Qty: 1, Cooked: 0, NotCooked: 1 }, ]; var res = data.reduce(function(acc, obj) { var existItem = null; // 普通for循环替代find方法,兼容旧环境 for (var i = 0; i < acc.length; i++) { if (acc[i].DishName === obj.DishName) { existItem = acc[i]; break; } } if (existItem) { existItem.Qty += obj.Qty; existItem.Cooked += obj.Cooked; existItem.NotCooked += obj.NotCooked; return acc; } // 若需避免修改原数组对象,可替换为浅拷贝后push:acc.push({DishName: obj.DishName, Qty: obj.Qty, Cooked: obj.Cooked, NotCooked: obj.NotCooked}) acc.push(obj); return acc; }, []); console.log(res);
补充说明
- 上述代码完全遵循ES5语法标准,支持IE9及以上所有旧版浏览器
- 最终输出结果和你原有实现的运行结果完全一致
内容的提问来源于stack exchange,提问作者user16824066
相关产品推荐
相关产品推荐

