reduce方法能否使用两个累加器?如何传入额外常量
问题解答
1. 如何在reduce中实现“多累加器”效果
reduce本身仅支持一个累加器参数,但你可以将累加器设计为包含多个属性的对象,以此同时累积多组数据,完全不需要额外新建方法。比如你需要同时维护分组对象和收集two的数组,就把这两个目标都放进累加器对象里。
2. 直接访问外部常量/变量,无需额外传入
reduce的回调函数是闭包,可直接访问当前方法作用域内的所有常量、变量,不需要特意“传入”。只要目标常量在当前作用域可见,直接调用即可。
3. 针对你的代码的优化实现
原代码存在未定义item变量、直接修改实例属性this.arr带来副作用等问题,以下是调整后的版本,实现对one和two的统一处理:
method(items: any[]): Element[] { // 用对象作为累加器,同时维护分组对象xyz和收集two的数组arr const { xyz, arr } = items.reduce( (acc, line) => { // 修正原代码未定义的item,改用当前迭代的line const one = line.title; const two = line.asset; // 对one和two执行相同操作(示例保留原值,替换为你的实际逻辑即可) const processedOne = one; const processedTwo = two; // 累积分组数据到xyz acc.xyz[processedOne] = [...(acc.xyz[processedOne] || []), line]; // 累积two的处理结果到arr acc.arr.push(processedTwo); return acc; }, // 初始化累加器对象,明确两个属性的类型 { xyz: {}, arr: [] } as { xyz: { [key: string]: any[] }, arr: any[] } ); // 修正原代码未定义的value,改用累积得到的xyz const sets: Item[] = Object.entries(xyz).map( ([title, list]) => ({ list, title }) ); // 统一将arr赋值给实例属性,避免reduce内部的副作用 this.arr = arr; return sets; }
4. 如需抽离复杂逻辑,可新建方法
如果对one和two的操作逻辑较复杂,可抽成独立方法,再在reduce回调中调用:
// 抽离统一处理逻辑的私有方法 private processTargetValue(value: any): any { // 这里编写对one和two的相同操作逻辑 return value; } method(items: any[]): Element[] { const { xyz, arr } = items.reduce( (acc, line) => { const one = this.processTargetValue(line.title); const two = this.processTargetValue(line.asset); acc.xyz[one] = [...(acc.xyz[one] || []), line]; acc.arr.push(two); return acc; }, { xyz: {}, arr: [] } as { xyz: { [key: string]: any[] }, arr: any[] } ); const sets: Item[] = Object.entries(xyz).map(([title, list]) => ({ list, title })); this.arr = arr; return sets; }
内容的提问来源于stack exchange,提问作者user20320660
相关产品推荐
相关产品推荐

