使用reduce函数时出现filtered.push is not a function错误的技术求助
解决
reduce 报错:Uncaught TypeError: filtered.push is not a function 嘿,我一眼就揪出问题根源啦!你碰到的这个报错,核心原因是调用 reduce 时没传入初始值。
错误原因拆解
当你执行 order.ITEMS.reduce(...) 但不提供第二个参数(初始值)时,reduce 会把数组的第一个元素作为第一次迭代的 filtered 参数——也就是一个 item 对象,而不是空数组。对象根本没有 push 方法,所以控制台直接抛出了类型错误。
修正后的代码
只需要给 reduce 加上初始空数组 [] 作为第二个参数,问题就迎刃而解了:
function payload(order) { return { OrderId: order.ORDERID, Lines: order.ITEMS.reduce(function(filtered, item) { if (item.DispatchedNumber != undefined) { var newItem = { Qty: item.Qty, QtyShipped: item.DispatchedNumber } filtered.push(newItem); } return filtered; }, []) // 关键:添加初始空数组 } } // 测试用例示例 test = payload({ "ORDERID": 1, "ITEMS": [ { Qty: 5, DispatchedNumber: 3 }, { Qty: 2 }, // 无DispatchedNumber,会被过滤 { Qty: 4, DispatchedNumber: 4 } ] });
可选优化方案
如果追求代码可读性,也可以用 filter + map 的组合来实现同样逻辑,代码更直观:
function payload(order) { return { OrderId: order.ORDERID, Lines: order.ITEMS .filter(item => item.DispatchedNumber !== undefined) .map(item => ({ Qty: item.Qty, QtyShipped: item.DispatchedNumber })) } }
内容的提问来源于stack exchange,提问作者user88432
相关产品推荐
相关产品推荐

