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

如何在NGRX Reducer中为新项生成唯一ID?当前实现是否合理?

使用Math.random()生成待办项唯一ID是否可行?

直接结论:这种做法不可靠,不推荐使用,具体原因和替代方案如下:

为什么Math.random()不适合做唯一ID?

  • 重复风险:Math.random()返回0-1之间的浮点数,虽然重复概率极低,但并非绝对不可能。一旦出现ID重复,后续删除、更新待办项时会无法精准定位目标,引发逻辑错误。
  • 类型不一致:你现有初始数据的ID是整数类型(1、2),但Math.random()生成的是浮点数,类型不统一会增加后续维护成本,比如ID比较时可能出现隐式类型转换的问题。
  • 可读性差:浮点数ID不利于调试和问题定位,远不如自增ID这类直观的标识清晰。

推荐的替代方案

1. 自增整数ID(最适合当前场景)

利用现有待办列表的长度生成自增ID,完全适配你现有数据的类型,且不会出现重复:

on(TodoActions.addTodo, (state, { text }) => ({
  ...state,
  todos: [
    ...state.todos,
    {
      id: state.todos.length + 1, // 替换Math.random()
      task: `任务${state.todos.length + 1}`, // 替换无意义的随机字符串
      description: text,
      completed: false,
    },
  ],
})),

2. 时间戳+随机数(适配页面刷新/本地存储场景)

如果你的待办数据需要持久化(比如存在localStorage),页面刷新后自增ID会重置,这时可以用时间戳搭配小范围随机数:

id: Date.now() + Math.floor(Math.random() * 1000),

3. 标准UUID(大型应用首选)

对于更严谨的生产环境,可以引入UUID生成库(如uuid),生成符合标准的唯一标识符,几乎不存在重复可能:

// 先安装依赖:npm install uuid
import { v4 as uuidv4 } from 'uuid';

// 生成ID
id: uuidv4(),

内容的提问来源于stack exchange,提问作者Snorlax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:13:14