报错截图:
大致为:
ERROR Error: Uncaught (in promise): TypeError: Reduce of empty array with no initial value
TypeError: Reduce of empty array with no initial value
at Array.reduce (<anonymous>)
报错原因:
Reduce函数有选择性的接收 initialValue (将会被用作回调函数第一次被调用的参数)。然而,如果没有初始值提供,它会用 Array 或 TypedArray 的第一个元素作为初始值。当提供一个空数组的时候这个错误会出现,因为那种情况下没有初始值被返回
解决方式:
1.提供一个初始值作为操作符的中立元素,比如加法里的0,乘法里的1,或者是合并中的一个空字符串
实践代码:
abnormalSum = res.result.filter(item => item.inv_type == 'ct_abnormal_qty').map(item => {
let sum = 0
sum += item.qty
return sum
}).reduce((prev, cur) => {
return prev + cur;
}, 0); //后边0为设置的初始值
2.两方处理空的情况,要么在调用 reduce 之前,或者是在添加一个未预料的初始虚拟址后的回调函数中
参考代码:
var names = document.getElementsByClassName("names");
var name_list1 = "";
if (names1.length >= 1)
name_list1 = Array.prototype.reduce.call(names, (acc, name) => acc + ", " + name);
// name_list1 == "" when names is empty.
var name_list2 = Array.prototype.reduce.call(names, (acc, name) => {
if (acc == "") // initial value
return name;
return acc + ", " + name;
}, "");
// name_list2 == "" when names is empty.
参考链接:MDN官方文档