如何检查给定数组所有值是否唯一?JavaScript布尔返回函数实现
检查数组所有值是否唯一的JavaScript函数实现
嘿,我来给你分享几个实用的实现方案,用来判断数组里的所有元素是否唯一,返回布尔值。你可以根据自己的场景需求选合适的:
方法一:利用ES6 Set特性(最简洁高效)
Set的特性是自动去重,所以我们只需要对比原数组的长度和转换为Set后的大小就能判断。如果两者相等,说明所有元素都是唯一的;反之则存在重复。
function areAllUnique(arr) { return arr.length === new Set(arr).size; } // 测试示例 console.log(areAllUnique([1, 2, 3, 4])); // true console.log(areAllUnique([1, 2, 2, 4])); // false console.log(areAllUnique(['a', 'b', 'c', 'a'])); // false
这个方法代码极简,时间复杂度为O(n)(Set的插入和大小查询平均都是O(1)操作),整体效率很高。但要注意:对于对象、数组这类引用类型,Set是比较内存引用地址的——即使两个对象内容完全一致,只要引用不同,就会被判定为不同元素。
方法二:遍历数组检查重复(兼容旧环境)
如果需要兼容不支持ES6的老环境,可以用遍历+indexOf的方式:每次检查当前元素在数组中第一次出现的索引是否等于当前遍历的索引,不等就说明之前已经出现过该元素。
function areAllUnique(arr) { for (let i = 0; i < arr.length; i++) { if (arr.indexOf(arr[i]) !== i) { return false; } } return true; } // 测试示例 console.log(areAllUnique([5, 6, 7])); // true console.log(areAllUnique([5, 6, 6])); // false
这个方法兼容性拉满,但时间复杂度是O(n²)(indexOf每次都会重新遍历数组),数组规模较大时效率会明显下降。
方法三:用对象存储已出现元素(性能更优的兼容方案)
同样是遍历,但用对象记录已见过的元素,每次检查当前元素是否已存在于对象中,时间复杂度为O(n),比上一种方法高效很多。
function areAllUnique(arr) { const seen = {}; for (const item of arr) { // 给key加上类型前缀,避免数字1和字符串"1"被误判为重复 const key = typeof item + '-' + item; if (seen[key]) { return false; } seen[key] = true; } return true; } // 测试示例 console.log(areAllUnique([1, "1", 2])); // true(类型不同,不会被误判) console.log(areAllUnique([1, 1, 2])); // false
如果不需要区分相同值不同类型的情况,可以去掉类型前缀,直接用item作为对象的key。
特殊场景:数组包含引用类型的处理
如果数组里有对象、数组这类引用类型,上面的方法都会因为引用地址不同而无法识别内容重复的元素。这时候可以把元素转为JSON字符串来比较:
function areAllUniqueWithObjects(arr) { const seen = new Set(); for (const item of arr) { const str = JSON.stringify(item); if (seen.has(str)) { return false; } seen.add(str); } return true; } // 测试示例 console.log(areAllUniqueWithObjects([{a:1}, {b:2}, {a:1}])); // false console.log(areAllUniqueWithObjects([{a:1}, {b:2}])); // true
注意:JSON.stringify对undefined、函数、Symbol这类值的处理有局限,如果数组里包含这些类型,需要额外做适配处理。
内容的提问来源于stack exchange,提问作者Sergey Pleshakov
相关产品推荐
相关产品推荐

