Node.js中因PM2不支持可选链,转换判断逻辑遇问题求助
排查可选链转旧判断逻辑的失效问题
原代码使用可选链操作符(?.)能正确匹配销售记录,但转换为旧版判断逻辑后无法输出“purchase has been SOLD.”,问题出在转换后的判断逻辑错误。
原工作代码
// Working solution purchases.forEach((purchase) => { const matchingItems = sales.filter(obj => obj.elements[0]?.specialId === purchase.elements[0]?.specialId); if (matchingItems.length > 0){ console.log('purchase has been SOLD.') purchase.sold = true } })
转换后失效的代码
purchases.forEach((purchase) => { // const matchingItems = sales.filter(obj => obj.elements[0] && obj.elements[0].specialId === purchase.elements[0] && purchase.elements[0].specialId); const matchingItems = sales.filter((obj) => { return obj.elements[0] && obj.elements[0].specialId === purchase.elements[0] && purchase.elements[0].specialId }) if (matchingItems.length > 0){ console.log('purchase has been SOLD.') purchase.sold = true } })
错误原因分析
原可选链的逻辑是:当obj.elements[0]存在时取其specialId,否则为undefined;同时当purchase.elements[0]存在时取其specialId,否则为undefined,最后判断这两个值是否相等。
但转换后的代码逻辑完全偏离:由于===的优先级高于&&,实际执行顺序变成了obj.elements[0] && (obj.elements[0].specialId === purchase.elements[0]) && purchase.elements[0].specialId——这相当于把obj.elements[0].specialId和purchase.elements[0]对象本身做比较,而非比较两者的specialId;同时后面多余的purchase.elements[0].specialId会在值为假时(比如0、空字符串)导致整个条件不成立。
正确的转换代码
需要先分别处理两边的specialId取值逻辑,再做相等判断,和原可选链逻辑保持一致:
写法一(兼容性更强,适合specialId可能为假值的场景)
purchases.forEach((purchase) => { const matchingItems = sales.filter((obj) => { // 明确获取两边的specialId,不存在则为undefined const objSpecialId = obj.elements[0] ? obj.elements[0].specialId : undefined; const purchaseSpecialId = purchase.elements[0] ? purchase.elements[0].specialId : undefined; return objSpecialId === purchaseSpecialId; }) if (matchingItems.length > 0){ console.log('purchase has been SOLD.') purchase.sold = true } })
写法二(更紧凑,适合specialId始终为真值的场景)
purchases.forEach((purchase) => { const matchingItems = sales.filter((obj) => { return (obj.elements[0] && obj.elements[0].specialId) === (purchase.elements[0] && purchase.elements[0].specialId); }) if (matchingItems.length > 0){ console.log('purchase has been SOLD.') purchase.sold = true } })
内容的提问来源于stack exchange,提问作者TC23
相关产品推荐
相关产品推荐

