数组去重的方式有很多,我们可以使用 Set 去重、filter 过滤等,详见 [携程&蘑菇街&bilibili:手写数组去重、扁平化函数](https://mp.weixin.qq.com/s/NGl9nBkIruuzYkxqyPnB1A) ,但三种解法(Set、filter、reducer)都产生了新数组: > MDN : `filter()` 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。 那么我们如何在不产生性数组的情况下删除数组中的重复元素喃? ### 方式一:排序去重 > MDN:`sort()` 方法用[原地算法](https://en.wikipedia.org/wiki/In-place_algorithm)对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的 ```js const removeDuplicates = (nums) => { // 原地排序 nums.sort() // 去重 let len = 1 for (let i = 1; i < nums.length; i++) if (nums[i] != nums[i-1]) nums[len++] = nums[i]; // 删除重复项 nums.splice(len) return nums } // 测试 removeDuplicates([1, 2, 3, 1, 3]) // [1, 2, 3] ``` ### 方式二:优化 ```js const removeDuplicates = (nums) => { let len = nums.length - 1 for(let i = len; i>=0; i--) { if(nums.indexOf(nums[i]) != i) { nums[i] = nums[len --] } } // 删除重复项 nums.splice(len+1) return nums } // 测试 removeDuplicates([1, 2, 3, 1, 3]) // [1, 2, 3] ```
Activity
fxwing commentedon Dec 7, 2020
fxwing commentedon Dec 7, 2020
lyvvq9296 commentedon Dec 7, 2020
fxwing commentedon Dec 7, 2020
z253573760 commentedon Feb 2, 2021
XW666 commentedon Apr 20, 2021
const setArr = arr => {
// 利用对象属性唯一性
let obj = {}
for (let i = 0; i < arr.length; i++) {
if (obj[arr[i]]) {
arr.splice(i, 1);
i--
} else {
obj[arr[i]] = arr[i]
}
}
}
zixiaoyan12 commentedon May 11, 2022
// 双指针
const removeDuplicates = (nums) => {
nums.sort((a, b) => a - b);
let slow = -1;
for (let i = 0, len = nums.length; i < len; i++) {
if (nums[slow] !== nums[i]) {
nums[++slow] = nums[i];
}
}
return nums.slice(0, slow + 1);
};