JavaScript中BigInt数组去重:纯BigInt用Set最简洁高效;混合Number与BigInt且需数值相等去重时,应统一转String后过滤,避免类型混淆与精度丢失。

JavaScript 中对包含 BigInt 的数组去重,不能直接用 Set 或 filter + indexOf 等传统方法,因为 BigInt 与普通数字(Number)不相等,且 Set 虽然能正确识别 BigInt 值的唯一性,但要注意类型混用时的陷阱。
用 Set 直接去重(推荐,最简洁)
Set 本身支持 BigInt,并能正确区分 1n 和 1(后者是 number),只要数组中全是 BigInt,或你明确只按值去重(不跨类型比较),直接转成 Set 再转回数组即可:
const arr = [1n, 2n, 3n, 1n, 4n, 2n]; const unique = [...new Set(arr)]; // [1n, 2n, 3n, 4n]
✅ 优点:简洁、高效、语义清晰;
⚠️ 注意:如果数组里混有 Number 和 BigInt(如 [1, 1n]),它们不会被当作重复项——这是符合规范的(1 !== 1n),但如果你业务上希望“数值相等即去重”,就得手动处理。
按数值相等去重(兼容 Number 和 BigInt)
当数组可能同时含 Number 和 BigInt,且你想把 1 和 1n 视为重复时,需统一转换为可比形式(例如都转成 String,或都转成 BigInt / Number)。推荐转成字符串,因为大 BigInt 可能超出 Number.MAX_SAFE_INTEGER,无法安全转为 Number:
- 遍历数组,将每个元素用
String()转为字符串作为 key - 用
Map或对象记录是否已出现过该字符串表示 - 保留首次出现的原始值(保持原类型)
function uniqueByValue(arr) {
const seen = new Set();
return arr.filter(item => {
const key = String(item);
if (seen.has(key)) return false;
seen.add(key);
return true;
});
}
// 示例
const mixed = [1, 1n, 2n, 2, 9007199254740992n, 9007199254740992];
console.log(uniqueByValue(mixed)); // [1, 2n, 9007199254740992n]
避免踩坑的关键细节
-
JSON.stringify(1n)会报错,不能用于序列化或做 key —— 改用String(1n) -
Array.from(new Set([1n, 1]))得到[1n, 1],不是去重失败,而是它们本就不同 - 不要用
arr.indexOf(item) === i去重:因为indexOf在查找1n时,传入1找不到,但反过来用1n查1也找不到,逻辑混乱 - 扩展运算符和
Set对BigInt完全友好,放心用
不复杂但容易忽略。核心就两条:纯 BigInt 数组,用 Set 最省心;混合类型且需数值去重,统一转 String 再过滤。
立即学习“Java免费学习笔记(深入)”;


















