首先数组有flat方法
var newArray = arr.flat([depth]) //depth为扁平化的深度
console.log( [0, 1, 2, [3, 4]].flat(2)); //打印 [0, 1, 2, [3, 4]]
但是我们不用
一、简单版,二维数组降重(flat())
1.
function Flat1(arr){
return [].concat.apply([],arr);
// [].concat(...arr);
2.
//用不了,会报错
function Flat1(arr){
arr.reduce((cur,item)=>{
cur.concat(item)
})
二、多重版
1、递归
function myFlat(arr){
var res=[];
for(var i = 0;i<arr.length;i++){
if(arr[i] instanceof Array){
res= res.concat(myFlat(arr[i]))
}else{
res.push(arr[i])
}
}
return res;
}
2、Es6
const myFlat=function(arr){
return arr.reduce((res,item)=>{
return res.concat(Array.isArray(item)?myFlat(item):item);
},[])
}
踩坑:注意reduce的用法!
三、去重
1、 Set
const unique1=arr=>Array.from(new Set(arr));
2、filter
const unique2=arr=> {
if(!arr || arr===[]) return arr;
return arr.filter((item,index,self)=>self.indexOf(item)===index);
}
踩坑:注意filter的用法,是指过滤出指定的item全部放入新的数组里
3、reduce(reduce很强)
const unique3=arr=>arr.reduce((acc,cur)=>{
if(!acc.includes(cur)){
acc.push(cur);
}
return acc;
},[])
//踩坑,reduce里的函数一定要有返回值不能写成
const unique3=arr=>arr.reduce((acc,cur)=>{
if(!acc.includes(cur)){
return acc.push(cur);
}
},[])
4、循环,利用hashTable
function unique4(arr){
let table={};
for(let i=0;i<arr.length;i++){
//踩坑,hashTable,也就是对象,当跟据不存在的key找value时,value为undefined。
//但是考虑到value为undefined,key也有可能存在,故用一下语法判断
if(!(arr[i] in table)){
table[arr[i]]=arr[i];
}
}
let res=[];
//踩坑,对象的key永远为字符串,且对象不能用let item of table遍历!
for(let key in table){
res.push(table[key])
}
return res;
}