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

JavaScript数组复制洗牌后添加唯一id出现重复问题如何解决

问题原因
  • 引用类型浅拷贝问题:原数组元素为对象类型,使用展开运算符合并数组时仅复制了对象引用,两个相同名称的元素实际指向同一块内存地址,修改任意一个的id属性都会同步到另一个,直接导致id重复。
  • id赋值时机错误:循环中先给当前位置元素赋值id,随即执行元素交换。已经赋过id的元素被交换到未遍历区域时会被二次赋值覆盖id,未遍历到的元素被交换到已遍历区域时则不会被赋值,最终出现id重复、部分元素无id的问题。
解决方案

调整实现逻辑:先对每个元素做浅拷贝生成独立对象,完成数组复制后统一给所有元素添加唯一id,最后再执行洗牌算法打乱顺序。
修正后的代码如下:

const duplicateCards = (arr) => {
  // 复制数组时每个元素生成新的独立对象,避免引用共用
  const duplicatedArr = [...arr.map(item => ({...item})), ...arr.map(item => ({...item}))];
  // 先给所有元素添加唯一id
  duplicatedArr.forEach((item, index) => item.id = index);
  // 执行Fisher-Yates洗牌算法打乱顺序
  for (let i = duplicatedArr.length - 1; i > 0; i--) {
    const randomIndex = Math.floor(Math.random() * (i + 1));
    [duplicatedArr[i], duplicatedArr[randomIndex]] = [duplicatedArr[randomIndex], duplicatedArr[i]];
  }
  return duplicatedArr;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:48:01