You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:24:01