数组去重函数uniquifyArray未返回去重新数组问题求助
问题分析
原函数的核心错误在于判断条件newArray[i] !== arrays[i]——这是在比较两个数组相同索引位置的元素,而非检查当前元素是否已存在于新数组中。比如遍历到重复元素时,newArray[i]大概率是undefined(新数组长度始终短于原数组),导致条件永远为真,所有元素都会被推入新数组,完全起不到去重作用。
另外还有个细节问题:函数开头判断数组为空时返回null,通常更合理的是返回空数组[],避免后续处理null时触发不必要的错误。
修复方案
按照需求,我们可以用includes()或indexOf()方法检查元素是否已存在,两种方式都能实现正确去重:
方案1:使用includes()
const words = [ 'crab', 'poison', 'contagious', 'simple', 'bring', 'sharp', 'playground', 'poison', 'communion', 'simple', 'bring', ] function uniquifyArray(arr) { if (arr.length === 0) { return [] } const newArray = [] for (let i = 0; i < arr.length; i++) { // 检查当前元素是否未被加入新数组 if (!newArray.includes(arr[i])) { newArray.push(arr[i]) } } return newArray } // 测试输出:["crab", "poison", "contagious", "simple", "bring", "sharp", "playground", "communion"] console.log(uniquifyArray(words))
方案2:使用indexOf()
function uniquifyArray(arr) { if (arr.length === 0) { return [] } const newArray = [] for (let i = 0; i < arr.length; i++) { // indexOf返回-1表示元素不存在于新数组 if (newArray.indexOf(arr[i]) === -1) { newArray.push(arr[i]) } } return newArray }
可选优化(ES6+环境)
如果你的运行环境支持ES6及以上,用Set可以写出更简洁的去重代码:
function uniquifyArray(arr) { return arr.length === 0 ? [] : [...new Set(arr)] }
Set会自动过滤重复元素,再通过扩展运算符...转回数组即可。
内容的提问来源于stack exchange,提问作者TeeP
相关产品推荐
相关产品推荐

