建树 · 拍平 · 表头行转换 · Map 索引 · 笛卡尔积 · 楼中楼 · 多字段聚合
每题带完整输入输出 · 多解法对比 · 复杂度分析 · 笔试工作高频
几乎每场前端笔试都考。工作里后端返回扁平数组,前端要构建成树给组件用。核心是用 Map 建索引实现 O(n)。
场景:后端返回部门扁平数组(带 pid),前端要构建成树给 el-tree / TreeView 组件。核心难点:怎么 O(n) 完成,而不是 O(n²)。
场景:把树形菜单存数据库要扁平化;或要做"搜索框过滤树"时先拍平再过滤再重建。
Excel 导出导入、CSV 处理、动态表单生成的核心算法。后端给对象数组,前端要转成表格;用户填的表格要转回对象数组提交。
场景:导出 Excel 时要把对象数组转成"表头+行";读取 CSV 文件时要把"表头+行"转回对象数组。本质就是 map + 解构。
把对象数组转成以 id 为 key 的 Map/对象,查找从 O(n) 降到 O(1)。这是前端性能优化最常用的技巧。
场景:列表展示商品,要关联显示分类名。每个商品去 categories 数组里 find 一次分类 = O(n²);先建 map 再查 = O(n)。
笔试中的"数学味"题。转置是表格行列互换,笛卡尔积是规格组合。
场景:表格"行列互换"功能(Excel 的转置粘贴);笔试常考的矩阵操作。
result[j][i] = matrix[i][j]。map 版的外层遍历列号,内层遍历每个行取该列。行列长度不必相等也能用。场景:电商 SKU 规格组合。商品有"颜色×尺码×版本"三个维度,每个维度多个选项,要生成所有组合。如颜色[红,蓝] × 尺码[S,M] = [(红,S),(红,M),(蓝,S),(蓝,M)]。
[[]](包含一个空数组的数组),不是 []!因为第一次 reduce 要把空组合和第一个维度拼接,[] 会导致 flatMap 没东西可扩展,结果一直是空。把前面学的树转换、聚合组合起来,解决真实业务场景。
场景:微博/掘金/B站的评论系统。后端返回扁平评论数组(带 parentId 和 replyTo),前端要构建成"楼中楼"嵌套结构展示。本质还是 listToTree,但要处理回复对象谁。
场景:销售报表,要把订单按"部门+月份"分组,统计每组订单数、总金额、平均金额。类似 SQL 的 GROUP BY dept, month。
|、_)拼成一个字符串当 key。注意分隔符不能出现在字段值里,否则会冲突。这是 SQL GROUP BY 的 JS 版本。前端笔试和工作都高频。多字段排序是列表"先按状态再按时间"的核心;对象去重要会用 Map。
场景:订单列表"先按状态(待支付→已支付→已完成)升序,状态相同时按时间降序"。规则:第一个字段不同就按它走,相同才看第二个字段。
if (a.x !== b.x) return a.x - b.x; return 比第二字段。这就是"字典序"——先看第一字段,相同才看第二。支持任意多个字段,串联 if 即可。场景:合并多个接口的数据后去重;用户重复点击产生的重复记录要清理。Set 只能去重基本类型,对象必须用 Map。
new Set([{id:1},{id:1}]) 还是两个,因为对象引用不同;② 保留首次还是末次要讲清楚,业务上常常是要"末次覆盖"(最新数据);③ 多字段去重把复合 key 拼起来:item.id + '_' + item.type。{ ...item, children: [] } 拷贝+改字段的标准写法。