TypeScript+React中有没有更函数式的方法合并排序数组生成计算器按钮?
计算器按钮数组生成优化方案
优化后实现
你的原有实现存在可变索引、逻辑耦合度高、冗余变量的问题,以下是符合函数式编程规范、可读性更强的实现:
const numbers = [3, 2, 1, 6, 5, 4, 9, 8, 7] const signs = ["AC", "√", "%", "÷", "*", "-", "+", "00", "0", ".", "="] const getCalculatorButtons = (): string[] => { // 拆分操作符为:首行功能键、数字行末尾运算符、底部功能键 const [headerOperators, rowEndOperators, bottomOperators] = [ signs.slice(0, 4), signs.slice(4, 7), signs.slice(7) ] // 数字数组倒序后每3个分为一组,对应三行数字按键 const numberRows = [...numbers].reverse().reduce((rows, num, index) => { const rowIndex = Math.floor(index / 3) rows[rowIndex] = [...(rows[rowIndex] || []), num.toString()] return rows }, [] as string[][]) // 数字行拼接对应末尾运算符 const middleRows = numberRows.map((row, index) => [...row, rowEndOperators[index]]) // 合并所有行后扁平化得到最终数组 return [headerOperators, ...middleRows, bottomOperators].flat() }
渲染逻辑可以保持不变,也可以优化key的取值(所有按钮字符唯一,可直接用字符作为key避免索引key的潜在问题):
{getCalculatorButtons().map((char) => ( <button key={char} className="calculator__button"> {char} </button> ))}
优化点说明
- 符合函数式要求:全程无可变变量,所有操作均为不可变操作,函数为纯函数,无副作用、相同输入稳定返回相同输出
- 可读性大幅提升:每一步逻辑语义明确,通过结构拆分还原了grid的行布局逻辑,后续调整布局不需要拆解复杂的条件判断
- 冗余代码清理:删除了原有实现中完全无用的
alphanumeric变量,减少不必要的内存开销 - 易维护性:如果后续需要调整按钮位置、新增按键,只需要修改对应分组的逻辑即可,改动量极小
- 性能一致:整体时间复杂度为O(n),和原有实现效率持平
内容的提问来源于stack exchange,提问作者Agnes Spencer
相关产品推荐
相关产品推荐

