数组去重与数组扁平化
一、数组去重
(1)indexOf()
function only(arr){ var res=[]; arr.forEach(function(item){ if(res.indexOf(item)==-1){ res.push(item); } }) return res; }
(2)Set结构
var set=new Set(arr); Array.from(set);
(3)filter过滤
function only(arr){ var res=[]; res=arr.filter(function(item,index,self){ if(self.indexOf(item)==index){ return item; } }) return res; }
(4)reduce()
function only(arr){ var res=[]; return arr.reduce((pre,cur)=>{ if(!pre.includes(cur)){ return pre.concat(cur); } else{ return pre; } },[]) }
(5)lastIndexOf()
function only(arr){ var res=[]; arr.forEach(function(item){ if(arr.indexOf(item)==arr.lastIndexOf(item)){ res.push(item); } }) return res; }
二、数组扁平化处理可以用reduce
例:实现一个flatten方法,使得输入一个数组,该数组里面的元素也可以是数组,该方法会输出一个扁平化的数组。
arr=[[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
console.log([1,2,2,3,4,5,5,6,7,8,9,11,12,12,13,14,10]);
(1)递归
function flatter(arr){ var res=[]; arr.map(function(item){ if(Array.isArray(item)){ res=res.concat(flatter2(item)); } else{ res.push(item); } }) return res; }
(2)reduce()
function flatten(arr){ return arr.reduce(function(pre,item){ return pre.concat(Array.isArray(item)?flatten(item):item); },[]); }
(3)toString()+spilt()+ParseInt()
调用数组的toString()方法,将数组变成字符串,然后再用split()分割还原成数组
function flatten(arr){ return arr.toString().split(',').map(function(item){ return parseInt(item); }) } function flatten(arr){ return arr.join(',').split(',').map(function(item){ return parseInt(item); })// 用join()方法也可以转成字符串 }
缺点:只适用于数组元素均为数字的情况。
(4)扩展运算符
ES6的扩展运算符能将二维数组变为一维。
[ ].concat(...[1,2,3,[4,5]])——>[1,2,3,4,5]
arr.some()只要有一个符合条件就返回true,所以循环遍历判断元素是否包含数组,如果有就使用一次扩展运算符。
function flatten(arr) { while(arr.some(item=>Array.isArray(item))) { arr = [].concat(...arr); } return arr; }