当前位置: 首页 > Web前端 > JavaScript

JS数组操作(扁平化,去重,排序,交集,并集,差分,二分查找,峰位)

时间:2023-03-27 12:26:41 JavaScript

整理完善数组相关操作:1.关于数组扁平化1.reduce//ifvalue如果是一个数组,递归遍历,否则concatfunctionflatten(arr){returnarr.reduce((result,item)=>{returnresult.concat(Array.isArray(item)?flatten(item):item);},[]);}//reduce是数组的一个方法,它接收一个函数作为累加器,数组中的每一个值(从左到右)开始递减,最后计算为一个值。//reduce包含两个参数:回调函数,传给total的初始值//求数组的值之和:arr.reduce((total,item)=>{//total是前面计算的result,item为数组的值returntotal+item;},0);2.toString&split//调用数组的toString方法,将数组转为字符串,然后用split恢复为数组functionflatten(arr){returnarr.toString().split(',').map(function(item){returnNumber(item);})}//因为split形成的数组的每一项都是一个字符串,so需要用map方法遍历数组,将每一项转化为数值类型3.join&split//同上面的toString,join也可以将数组转化为字符串functionflatten(arr){returnarr.join(',').split(',').map(function(item){returnparseInt(item);})}递归函数flatten(arr){varres=[];arr.map(item=>{if(Array.isArray(item)){res=res.concat(flatten(item));}else{res.push(item);}});returnres;}5.spreadoperator//es6spreadoperator可以把二维数组变成一维数组[].concat(...[1,2,3,[4,5]]);//[1,2,3,4,5]//根据这个结果我们可以做一个遍历,如果arr中包含数组,就使用一次展开运算符,直到没有为止。functionflatten(arr){while(arr.some(item=>Array.isArray(item))){arr=[].concat(...arr);}returnarr;}2.数组去重1.方法一(Set)Array.from方法用于将两类对象转换为真正的数组:类数组对象和可迭代对象(包括ES6新数据结构Set和Map)。ES6提供了一种新的数据结构Set。它类似于数组,但其成员的值是唯一的,没有重复值;varduplicate=Array.from(newSet(newArr1))2.方法2(reduce)//通过数组reduce方法,使用indexOf判断上层A回调返回数组中是否包含当前元素b的索引A。如果不存在,则将b元素添加到a数组中,否则直接返回a。varduplicate1=newArr1.reduce((a,b)=>{if(a.indexOf(b)===-1){a.push(b)}returna},[])3.方法3(数组下标去重方法)//通过数组的filter方法,使用indexOf获取过滤后的数组farr中当前元素ele的第一个索引值,如果该值等于当前索引值index则返回,否则过滤.varduplicate2=newArr1.filter((ele,index,farr)=>{returnfarr.indexOf(ele)===index})4.方法四(遍历数组)//遍历数组,新建一个duplicate3数组,使用indexOf判断元素是否存在于duplicate3的新数组中,如果不存在则push到duplicate3的新数组中。varduplicate3=[]for(vari=0;iarr[j+1]){让temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp}}}returnarr}bubbleSort(initarr)3.插入排序函数insertSort(arr){//假设第一个元素已经排序为(leti=1;i=0&&temp在循环中不断切割区间for(fraction;fraction>0;fraction=Math.floor(fraction/2)){//以区间值为for开始遍历(vari=fraction;i=0&&arr[j]>arr[fraction+j];j-=fraction){vartemp=arr[j];arr[j]=arr[分数+j];//移动arr[fractionback+j]=temp;//fill}}}}varsort3=shellSort(initarr)4.交集,并集,差集1,ES7方式//并集  letunion=a.concat(b.filter(v=>!a.includes(v)))//[1,2,3,4,5]  //交集  letintersection=a.filter(v=>b.includes(v))//[2]  //差集  letdifference=a.concat(b).filter(v=>a.includes(v)&&!b.includes(v))//[1,3]2、ES6letaSet=newSet(a)letbSet=newSet(b)//合并letunion=Array.from(newSet(a.concat(b)))//[1,2,3,4,5]//交集letintersection=Array.from(newSet(a.filter(v=>bSet.has(v))))//差集letdifferenceNew=Array.from(newSet(a.concat(b).filter(v=>aSet.has(v)&&!bSet.has(v))))3、ES5//并集varunion=a.concat(b.filter(function(v){returna.indexOf(v)===-1}))//[1,2,3,4,5]//交集varintersection=a.filter(function(v){returnb.indexOf(v)>-1})//[2]//差集vardifference=a.filter(function(v){returnb.indexOf(v)===-1})//[1,3]考疑有NaNvara=[1,2,3,NaN];变量b=[2,4,5];varaHasNaN=a.some(函数(v){returnisNaN(v)})varbHasNaN=b.some(function(v){returnisNaN(v)})//unionvarunion=a.concat(b.filter(function(v){returna.indexOf(v)===-1&&!isNaN(v)})).concat(!aHasNaN&bHasNaN?[NaN]:[])//[1,2,3,4,5,NaN]//交集变量intersection=a.filter(function(v){returnb.indexOf(v)>-1}).concat(aHasNaN&bHasNaN?[NaN]:[])//[2]//差异vardifference=a.filter(function(v){returnb.indexOf(v)===-1&&!isNaN(v)}).concat(aHasNaN&&!bHasNaN?[NaN]:[])//1,3,NaN5.二分查找使用二分查找的前提是有序数组functionhalfSearch(arr,aim){letmin=0,max=arr.length-1;while(min<=max){lethalf=parseInt((min+max)/2)if(aim==arr[half]){returnhalf}elseif(arr[half]>aim){max=half-1}elseif(arr[half]nums[mid+1]){high=mid;}else{低=中+1;}}returnhigh;}//或者直接调用js接口:letpeakVal=arr=>{returnarr.indexOf(Math.max(...arr))}2.当峰值大于的值时左右相邻元素:letpeakVal1=arr=>{letlen=arr.length-1,peakValArr=[];for(leti=0;iarr[i-1]&&arr[i]>arr[i+1]){peakValArr.push(i)}elseif(arr[0]>arr[1]){peakValArr=[0]}else{peakValArr=[len]}}返回peakValArr。加入()}