个人整理几种数组去重的方法
1、 用arr.reduce()+includes方法
let arr = [11,9,11,3,55,6,9,1008,3,7,7];
// 这个写法不能用push因为返回的是数组的长度 如果返回的是rec 则可以用这个方法
function once(arr){
return arr.reduce((rec,dec)=>{
return rec.includes(duc)? rec : rec.concat
},[])
}
console.log(once(arr)) // [11, 9, 3, 55, 6, 1008, 7]
2、用ES6的 new Set() 方法
// new Set 储存任何类型的唯一值 得到一个新的set对象 会自动去重
let model = [11,9,11,3,55,6,9,1008,3,7,7];
function once(arr){
let obj = new Set(arr)
// 用 Array.from() 转化成数组
// return Array.from(obj)
// 用解构赋值转化成数组
// return [...obj]
// 用Object.values() 转化成一个数组
let itera = obj.values(); // 返回一个set迭代器对象
let arr4 = [];
for(key of itera){
arr4.push(key)
}
return arr4
}
console.log(once(model)) // [11, 9, 3, 55, 6, 1008, 7]
// 第二种方法
let model = [11,9,11,3,55,6,9,1008,3,7,7];
function once(arr){
let set = new Set()
let newArr = [];
arr.map((item,index)=>{
if(!set.has(item)){
set.add(item)
}
})
return [...set]
}
console.log(once(model)) // [11, 9, 3, 55, 6, 1008, 7] */
3、嵌套for循环+splice
// 如果数组中有NaN {} [] NaN不等于NaN 对象也不等于对象因为地址不一样 只有Object.is(NaN, NaN) 返回的是true
let model = [11,9,11,3,55,6,9,1008,3,7,7];
let model2 = ['1','2','s',1,'2',[],[],'a','b','b',{},{},NaN,NaN,null,null,undefined,undefined]
function once(arr){
for(let i =0 ;i<arr.length;i++){
for(let j =i+1; j<arr.length; j++){
if(arr[i] === arr[j]){
arr.splice(j,1);
}
}
}
return arr
}
console.log(once(model)) // [11, 9, 3, 55, 6, 1008, 7]
console.log(once(model2)) // ["1", "2", "s", 1, Array(0), Array(0), "a", "b", {…}, {…}, NaN, NaN, null, undefined]
4、for + includes + push()
function once(arr){
let arr2 = [];
for(let i =0; i<arr.length; i++){
if(!arr2.includes(arr[i])){
arr2.push(arr[i])
}
}
return arr2
}
console.log(once(model)) // [11, 9, 3, 55, 6, 1008, 7]
5、forEach+includes+push
let model = [11,9,11,3,55,6,9,1008,3,7,7];
function once(arr){
let arr2 = [];
if(!Array.isArray(arr)) return
arr.forEach((item, index) => {
if(!arr2.includes(item)){
arr2.push(item)
}
});
return arr2
}
console.log(once(model)) // [11, 9, 3, 55, 6, 1008, 7]
6、filter + indexOf
let model = [11,9,11,3,55,6,9,1008,3,7,7];
function once(arr){
if(!Array.isArray(arr)) return
return arr.filter((item, index)=>{
// 遍历出元素第一次出现的下标与当前下标相等的 就是新的数组元素
return arr.indexOf(item) == index
})
}
console.log(once(model)) // [11, 9, 3, 55, 6, 1008, 7]
7、 for+indexOf+push
let model = [11,9,11,3,55,6,9,1008,3,7,7];
function once(arr){
if(!Array.isArray(arr)) return
let arr2 = [];
for(let i = 0; i<arr.length; i++){
/* if(arr.indexOf(arr[i]) == i){
arr2.push(arr[i])
} */
// 或者
if(arr2.indexOf(arr[i]) == -1){
arr2.push(arr[i])
}
}
return arr2
}
console.log(once(model)) // [11, 9, 3, 55, 6, 1008, 7] */
去重的方法
1、arr.reduce()+includes
2、new Set()
3、嵌套for循环+splice
4、for + includes + push()
5、forEach+includes+push
6、filter + indexOf
7、for+indexOf+push