一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
前提
数组去重对于数组成员来讲主要分为基本数据类型和引用数据类型两类。
let arr1 = [1, 2, 5, 4, 44, 33, 2, true, 1, false, null, null, false, 55, 44];
let arr2 = [ { id: 1, b:1 }, { id:1, b:1 }, { id: 2, b: 2 }, { id: 3, b: 3 } ] ;
利用成员唯一/ key值唯一的特性
- set()
let newArr = new Set(arr1);
// Array.from : 将set数据结构转成真正的数组;
let result = Array.from(newArr);
// 或者下面这种写法:
// let result = [...newArr];
console.log(result); // [1, 2, 5, 4, 44, 33, true, false, null, 55]
- Object() / Map()
let obj = {};
arr1.forEach((item) => {
obj[item] = item
})
let result = Object.values(obj);
console.log(result); // [1, 2, 4, 5, 33, 44, 55, true, false, null]
tip: 众所周知Object是一组无序键值对的集合。但是有个小现象,如果对象的key是number类型的话,object会自动对其进行排序。
let arr = [1,6,3,2,5,6,3,4,3,45,56,34,3,3,1,1,6];
let obj = {};
arr.forEach((item) => {
obj[item] = item
})
let result = Object.values(obj);
console.log(result); // [1, 2, 3, 4, 5, 6, 34, 45, 56]
tip: 同时该方法也可用于成员是对象的数组去重。前提是:需求里需要指定唯一值,比如在文章开头中的设定就是id值唯一。
let obj = {};
arr2.forEach((item) => {
obj[item.id] = item
})
let result = Object.values(obj);
console.log(result);
tip: Map()的实现思路与Object一致,都是基于key值唯一的特性。这里就不列举代码了
- 利用hasOwnProperty()
let obj = {};
arr1.forEach((item) => {
if (obj.hasOwnProperty(item)) return;
obj[item] = item;
})
let result = Object.values(obj);
console.log(result); // [1, 2, 4, 5, 33, 44, 55, true, false, null]
遍历数组,利用数组实例方法查找被遍历到的元素是否存在于新数组中
- indexOf / lastIndexOf / includes / find / findIndex / findLast / findLstIndex 思路:创建一个新的数组,遍历目标数组,通过indexOf / includes判断遍历到的元素是否存在于新数组中,如果存在则什么都不做,继续下次循环。如果不存在,则push到新数组中,再继续进行下次循环。
let newArr = []
arr1.forEach(item => {
// 当使用indexOf的时候
if (newArr.indexOf(item) === -1) newArr.push(item);
// 当使用lastIndexOf的时候
if (newArr.lastIndexOf(item) === -1) newArr.push(item);
// 当使用includes时 等价于上面
if (!newArr.includes(item)) newArr.push(item);
// 当使用find的时候
if (newArr.find((arg) => arg === item)) == undefined) newArr.push(item);
// 当使用findLast的时候
if (newArr.findLast((arg) => arg === item)) == undefined) newArr.push(item);
// 当使用findIndex的时候
if (newArr.findIndex((arg) => arg === item)) == -1) newArr.push(item);
// 当使用findLastIndex的时候
if (newArr.findLastIndex((arg) => arg === item)) == -1) newArr.push(item);
})
console.log(newArr); // [1, 2, 5, 4, 44, 33, true, false, null, 55]
先进行排序,再遍历数组从第一个数开始进行两两对比。
注意:该方法只针对数组元素为Number的时候。
- sort()
let arr1 = [1, 2, 5, 4, 44, 33, 2, 1, 55, 44];
let newArr = arr1.sort((a, b) => a - b);
for (let i = 0; i < newArr.length - 1; i++){
if (newArr[i] === newArr[i+1]) {
newArr.splice(i+1, 1);
i--;
}
}
console.log(newArr); // [1, 2, 4, 5, 33, 44, 55]
- 冒泡排序 / 归并排序 / 二分法排序 / 插入排序...
// 这里就不列举代码了。除了具体排序的代码有所不同,其他的代码与上述一样。
- 关于排序之后的判断,还可以利用reduce()方法
let arr1 = [1, 2, 5, 4, 44, 33, 2, 1, 55, 44];
let newArr = arr1.sort((a, b) => a - b);
// reduce : 第一个是函数,第二个参数会传给第一次回调的prev;
let result = newArr.reduce((prev, next) => {
// 该函数返回值是下一次执行的prev;
return prev.includes(next)?prev:[...prev,next];
}, [])
console.log(newArr); // [1, 2, 4, 5, 33, 44, 55]
欢迎评论区补充
有总结不全的,还请各位掘友帮忙评论区补充一下哦...