前端生成一个随机的id,解决前端新增和删除问题

本文探讨了前端处理数据新增与删除时的随机ID生成策略,特别是在未直接操作数据库的情况下,如何确保本地数据操作的一致性和唯一性。通过一个具体的JavaScript函数实现,展示了如何生成符合UUID规范的随机ID,并在数据列表中应用这些ID进行有效的数据管理和操作。
generateId() {
  const s = [];
  const hexDigits = '0123456789abcdef';
  for (let i = 0; i < 36; i++) {
    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
  }
  // bits 12-15 of the time_hi_and_version field to 0010
  s[14] = '4';
  // bits 6-7 of the clock_seq_hi_and_reserved to 01
  s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
  s[8] = s[13] = s[18] = s[23] = '-';

  const uuid = s.join('');
  return uuid;
},

主要解决的问题是:

     当不经过数据库操作,新增和删除只是前端进行简单的处理,等点击save才进入数据库时,这时候需要考虑随机数的应用了。

新增的时候,进行push操作 

this.dataList.push({
  name:'',
  titile:'',
  id:this.generateId()
})

删除的时候

/** 删除数据的方法*/
deleteData(row){
  // 你确定要删除这条数据嘛?
  this.$confirm('Are you sure you want to delete this data?', 'Delete', {
    cancelButtonText: 'Cancel',
    confirmButtonText: 'OK',
    type: 'warning'
  }).then(() => {             this.dataList = this.dataList.filter(item => (item.id !== row.id));  }).catch(() => {
  });

},
<think>根据用户的问题引用内容,用户希望了解在JavaScript中如何为新增对象生成整数ID并赋值。结合引用[1]引用[2]提到的Symbol类型,但用户明确要求整数ID,因此Symbol不适用。引用[3]引用[4]与ID生成无关。 用户要求的是整数ID,所以需要生成整数类型的唯一标识符。以下是几种生成整数ID的方法: ### 方法1:自增计数器(适用于单线程) ```javascript let nextId = 1; // 起始ID function createObjectWithId(data) { return { id: nextId++, ...data }; } const obj1 = createObjectWithId({ name: 'Alice' }); const obj2 = createObjectWithId({ name: 'Bob' }); console.log(obj1.id); // 1 console.log(obj2.id); // 2 ``` ### 方法2:使用时间戳(可能重复,需结合随机数) ```javascript function generateIntegerId() { // 时间戳(13位)取模避免过大,加上随机数减少冲突 return Date.now() % 1000000 + Math.floor(Math.random() * 1000); } const obj = { id: generateIntegerId() }; console.log(obj.id); // 例如 123456789 ``` ### 方法3:Web Worker安全生成(多线程环境) 在Web Worker中使用`Atomics`保证原子操作: ```javascript // 主线程 const idCounter = new SharedArrayBuffer(4); const idView = new Int32Array(idCounter); Atomics.store(idView, 0, 0); // 初始值 // Worker线程中安全获取ID function getNextId() { return Atomics.add(idView, 0, 1); // 原子加1 } ``` ### 方法4:使用数据库自增ID(后端配合) 如果数据需要持久化,应由后端生成: ```javascript // 前端发送请求获取ID async function fetchNewId() { const response = await fetch('/api/generate-id'); const { id } = await response.json(); return id; } ``` ### 选择建议 | 场景 | 方法 | |--------------------|-------------------| | 纯前端临时对象 | 自增计数器 | | 需要随机性 | 时间戳+随机数 | | 多线程环境 | SharedArrayBuffer | | 持久化存储 | 后端生成 | ### 注意事项 1. **整数范围**:JavaScript整数安全范围为`-2^53 + 1`到`2^53 - 1`,但自增计数器通常足够用[^1]。 2. **冲突处理**:随机数方案在极端情况下可能重复,需根据业务需求评估。 > 引用说明: > 自增计数器方案参考了闭包保存状态的模式[^3]。 §§相关问题§§ 1. 如何确保多用户同时操作时前端生成ID不冲突? 2. 使用时间戳生成整数ID的精度问题如何解决? 3. JavaScript中整数ID的最大安全值是多少?</think>### JavaScript 生成整数 ID 并赋值给新增对象的方法 #### 方法 1:自增计数器(最常用) ```javascript // 全局计数器(闭包保护) const idGenerator = (() => { let counter = 0; return () => counter++; })(); // 创建对象并分配整数ID const newObj = { id: idGenerator(), name: "Object 1" }; console.log(newObj.id); // 0 const nextObj = { id: idGenerator(), name: "Object 2" }; console.log(nextObj.id); // 1 ``` **特点**: - 简单高效,ID 连续递增 - 使用闭包保护计数器状态[^3] - 适合临时对象单页应用 #### 方法 2:时间戳取整(避免冲突) ```javascript function generateIntId() { // 取毫秒时间戳的后6位整数 return parseInt(Date.now().toString().slice(-6), 10); } const obj = { id: generateIntId(), data: "测试数据" }; console.log(obj.id); // 类似 234567 (随时间变化) ``` #### 方法 3:随机生成(不重复保证) ```javascript function getRandomIntId(min = 1000, max = 999999) { // 生成区间内的随机整数 return Math.floor(Math.random() * (max - min + 1)) + min; } const users = [ { id: getRandomIntId(), name: "张三" }, { id: getRandomIntId(), name: "李四" } ]; console.log(users[0].id); // 类似 384756 ``` #### 方法 4:数据库风格(预分配ID池) ```javascript class IdPool { constructor(start = 0, step = 1) { this.nextId = start; this.step = step; this.recycledIds = []; } acquire() { return this.recycledIds.length > 0 ? this.recycledIds.pop() : this.nextId += this.step; } release(id) { this.recycledIds.push(id); } } // 使用示例 const pool = new IdPool(100, 1); // 从100开始分配 const objA = { id: pool.acquire() }; // 100 const objB = { id: pool.acquire() }; // 101 pool.release(objA.id); const objC = { id: pool.acquire() }; // 复用100 ``` ### 最佳实践建议 1. **单页应用**:使用自增计数器(方法1) 2. **需要随机性**:时间戳或随机数(方法2/3) 3. **对象回收场景**:ID池管理(方法4) 4. **持久化存储**:结合后端生成ID ### 注意事项 1. **整数范围**:JavaScript 安全整数范围为 $[-2^{53}+1, 2^{53}-1]$,足够常规使用[^1] 2. **多线程环境**:在 Web Worker 中使用 `Atomics` 保证原子操作 3. **冲突检测**:重要数据添加ID重复检查 ```javascript const existingIds = new Set(); function getSafeId() { let newId; do { newId = generateIntId(); } while(existingIds.has(newId)); existingIds.add(newId); return newId; } ``` > 引用说明: > 闭包实现的自增计数器参考了函数作用域保护状态的模式[^3];整数范围限制参考了JavaScript数字标准[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值