JavaScript reduce()方法的解构赋值在IE11中报错,求解决方案
问题原因分析
你遇到的错误并不是reduce()方法本身的兼容问题,而是代码里用到了两个IE11不支持的ES6特性:
- 对象解构赋值:
(r, { jahr, monat })这种从参数对象中直接提取属性的写法,IE11完全不支持 - 箭头函数:
=>语法同样是ES6新增特性,IE11没有实现这一功能
虽然reduce()从IE9开始就被支持,但这两个ES6语法才是导致报错的核心原因。
解决思路与修改后的代码
我们需要把这两个不兼容的ES6特性替换成IE11支持的ES5语法:
- 把箭头函数替换成普通的
function声明 - 把对象解构改成手动从当前遍历的元素中获取
jahr和monat属性 - 另外,IE11对
const的支持存在局限(比如不允许在块级作用域重复声明等),建议把const data换成var来保证兼容性
修改后的代码如下:
var data = [{ 'jahr': '2017', 'monat': '3' }, { 'jahr': '2017', 'monat': '3' }, { 'jahr': '2017', 'monat': '4' } ]; var map = new Map(), ergebnisMonat = data.reduce(function(r, item) { var jahr = item.jahr; var monat = item.monat; var datum = [monat, jahr].join('-'); if (!map.has(datum)) { map.set(datum, { datum: datum, anzahl: 0 }); r.push(map.get(datum)); } map.get(datum).anzahl++; return r; }, []); console.log(ergebnisMonat);
额外说明
如果你的项目中有大量ES6代码需要兼容IE11,更高效的方式是使用Babel这类转译工具,自动将ES6+代码转译为IE11支持的ES5代码,这样就不用手动修改每一处不兼容的语法了。
内容的提问来源于stack exchange,提问作者InFlames82
相关产品推荐
相关产品推荐

