数组扁平化和去重的实现

首先数组有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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。