前端生成便于在循环中操作的短id

178 阅读1分钟

我的需求是这样的,在使用地图时,根据后端返回的经纬度生成一些标记物markers,后端返回的数据不能直接用,需要我添加一个9位的短id。考虑到id不能重复。也不需要提交给后端。并且需要在循环中使用。所以我使用生成器和迭代器完成需求。

//export default默认导出生成器函数

export default function* generatorFn() {

  const t = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz1234567890'
  const a = t.length
  //getId用于生成一条随机的字符串
  
  function getId() {
    let n = ''
    for (let i = 0; i < 9; i++) {
      n += t.charAt(Math.floor(Math.random() * a));
    }
    return n
  }
  
  let idList = new Set()  //idList用于判断id是否重复
  let args = 1  //循环次数
  
  for (let i = 0; i < args; i++) {
    let id = getId()
    if(idList.has(id)){  //如果重复则进入下次循环
      args++
      continue
    }else{
      args++  
      idList.add(id)
      yield id //如果不重复则yield id,阻塞函数执行
    }
  }
}
//在需要使用的页面引入
import generatorFn from 'yoururl'

const iterator = generatorFn()
markers.push({
    id:iterator.next().value  //调用迭代器的next()方法
})