一、数组去重的方式
- 使用 Set 对象:使用 Set 对象可以很容易地去重,代码简洁易读。Set 对象是 ES6 新增的数据结构,它会自动过滤掉数组中的重复项,并保留数组中的顺序。但是,使用 Set 对象去重的缺点是,它只能处理基本数据类型的数组,对于复杂数据类型的数组,需要先将其转换为基本数据类型的数组。
const arr = [1, 2, 2, 3, 3, 4, 5, 5]; const uniqueArr = [...new Set(arr)]; console.log(uniqueArr); // [1, 2, 3, 4, 5]
- 应用场景:适用于需要快速简单地去重基本数据类型数组的场景,比如去除重复的数字、字符串等。
- 使用 filter 方法:使用 filter 方法遍历数组,并通过 indexOf 方法检查每个元素是否已经在新数组中出现过。filter 方法返回的是一个新数组,可以用于过滤或转换数组。
const arr = [1, 2, 2, 3, 3, 4, 5, 5]; const uniqueArr = arr.filter((item, index) => arr.indexOf(item) === index); console.log(uniqueArr); // [1, 2, 3, 4, 5]
- 应用场景:适用于较小的数组,并且数组中的元素不是基本数据类型。由于使用 indexOf 方法需要遍历整个数组,因此对于较大的数组,性能可能会受到影响。
- 使用 reduce 方法:使用 reduce 方法遍历数组,并通过 includes 方法检查每个元素是否已经在新数组中出现过。reduce 方法可以执行一个累加器函数来对数组的每个元素进行累积,最终返回一个单一的值。
const arr = [1, 2, 2, 3, 3, 4, 5, 5]; const uniqueArr = arr.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []); console.log(uniqueArr); // [1, 2, 3, 4, 5]
- 应用场景:适用于需要处理较大的数组,并且数组中的元素不是基本数据类型。由于使用 includes 方法的时间复杂度是 O(n),因此对于较大的数组,性能比 filter 方法更好。
综上所述,这三种方法都可以有效地去重数组中的重复项,但应根据具体情况选择合适的方法。对于基本数据类型的数组,使用 Set 对象可以更加简洁明了,对于较大的数组,并且数组中的元素不是基本数据类型,使用 reduce 方法更加高效。对于需要对数组进行转换的场景,filter 方法更适合。
二、如何实现数组的交集
- 使用 filter 方法和 includes 方法:使用 filter 方法遍历其中一个数组,并使用 includes 方法检查当前元素是否存在于另一个数组中。
javascriptCopy code
const arr1 = [1, 2, 3, 4, 5];
const arr2 = [3, 4, 5, 6, 7];
const intersection = arr1.filter(item => arr2.includes(item));
console.log(intersection); // [3, 4, 5]
- 使用 Set 对象:使用 Set 对象可以很容易地找到两个数组的交集。
javascriptCopy code
const arr1 = [1, 2, 3, 4, 5];
const arr2 = [3, 4, 5, 6, 7];
const set1 = new Set(arr1);
const set2 = new Set(arr2);
const intersection = [...set1].filter(item => set2.has(item));
console.log(intersection); // [3, 4, 5]
- 使用 reduce 方法:使用 reduce 方法遍历其中一个数组,并使用 includes 方法检查当前元素是否存在于另一个数组中,将符合条件的元素加入到结果数组中。
javascriptCopy code
const arr1 = [1, 2, 3, 4, 5];
const arr2 = [3, 4, 5, 6, 7];
const intersection = arr1.reduce((prev, cur) => arr2.includes(cur) ? [...prev, cur] : prev, []);
console.log(intersection); // [3, 4, 5]
三、去重对象数组怎么办?
1.##### 1.使用filter和Map
代码简洁,好用,4行代码搞定,平均耗费时间最短,五星推荐
function uniqueFunc(arr, uniId){
const res = new Map();
return arr.filter((item) => !res.has(item[uniId]) && res.set(item[uniId], 1));
}
复制代码
2.使用reduce
代码稍多,平均耗费时间和第一不分伯仲,四星推荐
function uniqueFunc2(arr, uniId){
let hash = {}
return arr.reduce((accum,item) => {
hash[item[uniId]] ? '' : hash[item[uniId]] = true && accum.push(item)
return accum
},[])
}
复制代码
3.使用for循环
耗费时间较一二稍多,但是耗费时间平均,三星推荐
function uniqueFunc3(arr, uniId){
let obj = {}
let tempArr = []
for(var i = 0; i<arr.length; i++){
if(!obj[arr[i][uniId]]){
tempArr.push(arr[i])
obj[arr[i][uniId]] = true
}
}
return tempArr
}
3.双重for循环