JavaScript数组去重实现大小写不敏感的核心是统一字符串为小写比较但保留原始值,推荐用Set记录小写key并filter筛选首次出现项,需判断类型避免非字符串调用toLowerCase报错。

JavaScript 数组去重时实现大小写不敏感,核心思路是:**统一转换为同一种大小写(如小写)后再比较,但保留原始值**。不能直接对原数组元素调用 toLowerCase() 后去重再返回小写结果——用户通常希望去重后仍保持原始大小写形式(比如 "Apple" 和 "apple" 视为重复,保留第一个出现的 "Apple")。
使用 Set + toLowerCase() 映射去重(推荐)
这是最简洁、高效且易读的方式:遍历数组,用一个 Set 记录已见过的「小写形式」,只保留首次出现的原始值。
function uniqueIgnoreCase(arr) {
const seen = new Set();
return arr.filter(item => {
const key = typeof item === 'string' ? item.toLowerCase() : item;
if (seen.has(key)) return false;
seen.add(key);
return true;
});
}
// 示例
const fruits = ["Apple", "banana", "APPLE", "Banana", "cherry"];
console.log(uniqueIgnoreCase(fruits)); // ["Apple", "banana", "cherry"]
用 reduce 实现并保留首次出现项
适合需要更明确控制逻辑或兼容老环境(无 Set)的场景。通过累加器维护已见 key 和结果数组。
- 每次将当前项转小写作为判断 key
- 若该 key 未出现过,推入结果并记录 key
- 非字符串类型可跳过 toLowerCase,避免报错
function uniqueIgnoreCase(arr) {
return arr.reduce((unique, item) => {
const key = typeof item === 'string' ? item.toLowerCase() : item;
if (!unique.some(x =>
typeof x === 'string' ? x.toLowerCase() === key : x === key
)) {
unique.push(item);
}
return unique;
}, []);
}
注意非字符串元素的处理
实际数据中数组可能混合类型(如 ["a", 1, "A", null])。盲目调用 .toLowerCase() 会报错。稳妥做法是:
立即学习“Java免费学习笔记(深入)”;
- 先用
typeof item === 'string'判断是否为字符串 - 仅对字符串执行大小写归一化,其他类型直接按原值比较
- 若需完全统一规则(如数字也“不区分大小写”),需额外定义逻辑(通常无需)
慎用 JSON.stringify 或 toString() 方案
有人尝试用 JSON.stringify(item).toLowerCase() 统一处理,但存在明显问题:
- 对象、数组会变成字符串,失去原始结构
-
null、undefined、布尔值等转换后语义混乱(如true.toString() === "true") - 性能差,且无法还原原始值
因此,**只对字符串做 toLowerCase,其余类型走严格相等判断**,才是安全可靠的做法。


















