Frontend SWE · CodeSignal OA Four Levels

Coinbase React Blog Posts OA:API 作者解析、点赞排序与本人删除

前端 OA 四层从 JSON 渲染、textarea 发布到 API 作者/current user、点赞排序及仅本人可删,处理同赞数最近获赞。

题目重点:前端 OA 四层从 JSON 渲染、textarea 发布到 API 作者/current user、点赞排序及仅本人可删,处理同赞数最近获赞。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版 post=(id,authorId,text,likes,lastLikedAt,createdAt),currentUserId 从 API 读取;lastLikedAt 字段是为了实现题目给的同赞数规则,若实际 API 没提供,不能凭 post 创建时间替代。
  • 本地新 post 以临时唯一 ID 和 currentUserId 插入 state,likes=0;是否向服务端 POST 题目只说本地 state,训练版不强制后端持久。
  • 只有 post.authorId===currentUserId 显示删除控制并允许本地删除;服务端真实权限仍需 API 鉴权,前端按钮不是安全边界。

解题路线

  1. L1 将本地 JSON 解析为 typed Post[],用稳定 post.id 做 React key;处理文本转义/空列表,避免直接拼 HTML。
  2. L2 表单输入受控,提交时 trim/validate,再用 setPosts(prev=>[newPost,...prev]);不要原地 push 导致 React 不重渲染。
  3. L3 并发获取 posts、users、currentUser,建 userId→displayName map;当前用户显示 'you',其他用户显示查到的名字,缺失作者给 fallback;loading/error 状态明确。
  4. L4 排序只在派生视图上做:likes 降序、lastLikedAt 降序、最后 post.id 稳定 tie-break;新增、删除、点赞状态变化均通过同一个 selector 重算。删除用 filter,先确认 authorId;API 真删除若要求则处理失败回滚。
  5. 测试同赞数不同 lastLikedAt、API 作者缺失、currentUser post、0 likes 新 post、重复提交、删除后排序、空数据及请求失败。

手动走一遍

训练例 A/B 都 5 likes,A 最后获赞 t=9、B 为 t=11,则 B 排前;C 有 6 likes 应排最前。当前用户新发 D 的 likes=0,若无点赞时间则落到已有高赞之后。仅 D.authorId=currentUserId 时显示删除按钮。

规模与取舍

P posts、U users:构建用户索引 O(U),映射列表 O(P),排序 O(P log P),额外 O(P+U)。每次 post state 变化重排 O(P log P);大列表可分页/虚拟化,但 OA 本地数据规模未公开。

易错点与追问

容易失分的边界

  • 按 authorId 直接显示数字,没映射到用户信息。
  • 把当前用户名字硬编码而非按 currentUserId 判。
  • 同 likes 仅按创建时间排序,违背最近获赞规则。
  • 直接 mutate posts 数组再 set 同引用。
  • 只隐藏删除按钮而没有服务端权限校验,就声称安全。

继续深挖

  • API 没有 lastLikedAt 如何解释排序不可实现?
  • 前端 optimistic delete 失败如何恢复?
  • 大量 posts 如何分页且保持排序一致?
  • 如何测试 current user 变更后按钮权限?
✓已复制微信号!