SonarQube提示reduce返回值必须被使用,如何修改对应JS代码
问题原因
- SonarQube报错的核心是你没有使用
reduce方法的返回值,reduce的设计目的是对数组元素做累积计算并返回最终结果,仅把它当成遍历方法使用属于不符合规范的用法。 - 现有代码还存在两个隐藏逻辑问题:
- 重复修改同一个
filterObject对象引用,最终columnList里所有元素都会指向同一个对象,值为最后一次遍历的赋值结果 - 每次遍历都清空
columnList,最终数组只会保留最后一个遍历项的内容,大概率不符合业务预期
- 重复修改同一个
修复方案
方案1:替换为更合适的遍历方法(推荐)
如果你只需要遍历数组做处理不需要累积计算,直接用forEach替换reduce即可解决报错,同时修正逻辑问题:
// 如果你需要保留所有处理后的项 const columnList = []; filtersArray.forEach(({field, operator, value}) => { value = btoa(value).toString(); // 每次创建新对象避免引用复用问题 const filterObject = {}; filterObject['attributeName'] = field; filterObject['FilterValue'] = value; filterObject['FilterOperator'] = operator; columnList.push(filterObject); }); // 如果你确实只需要最后一项的处理结果,不需要遍历 if (filtersArray.length > 0) { const {field, operator, value} = filtersArray.at(-1); const processedValue = btoa(value).toString(); const columnList = [{ attributeName: field, FilterValue: processedValue, FilterOperator: operator }]; }
方案2:正确使用reduce的返回值
如果你需要用reduce的累积能力,将累积结果赋值给变量即可解决报错,不需要额外声明外部的columnList和filterObject变量:
const columnList = filtersArray.reduce((acc, {field, operator, value}) => { value = btoa(value).toString(); acc.push({ attributeName: field, FilterValue: value, FilterOperator: operator }); return acc; }, []); // 初始值设为空数组作为累积容器 // 如果确实只需要最后一项,reduce写法如下 const columnList = filtersArray.reduce((acc, {field, operator, value}) => { value = btoa(value).toString(); // 直接替换累积数组里的内容,不需要判断清空 return [{ attributeName: field, FilterValue: value, FilterOperator: operator }]; }, []);
内容的提问来源于stack exchange,提问作者vamsi
相关产品推荐
相关产品推荐

