JavaScript数组常用算法操作~前端面试(二)

    xiaoxiao2022-07-06  194

    总结前端面试JS常用的数组操作,如扁平化数组、数组去重、求数组最大值、数组求和、排序、对象和数组的转化等。。。

    一、扁平化数组

    开始篇


    function flatten(arr){ while(arr.some(item=>Array.isArray(item))){ arr = [].concat(...arr) } return arr; } flatten([1,2,[3,4,[5]]]) //[ 1, 2, 3, 4, 5 ]

    实质是利用递归和数组合并方法concat实现扁平。

    终结篇


    [1,2,[3,4,[5]]].flat(1) //[ 1, 2, 3, 4, [ 5 ] ] [1,2,[3,4,[5]]].flat(Infinity) //[ 1, 2, 3, 4, 5 ]

    二、去重

    开始篇


    Array.prototype.distinct = function(){ const arr = this; const len = arr.length; const result = []; for(let i =0;i<len;i++){ for(j=i+1 ; j<len ; j++){ if(arr[i]===arr[j]){ j = ++i; } } result.push(arr[i]) } return result; } [1,2,3,3,3,4,4,5].distinct() //[ 1, 2, 3, 4, 5 ]

    终结篇


    [...new Set([1,2,2,3,4,4])] Array.from(new Set([1,2,2,3,4,4]))

    三、排序

    开始篇:


    冒泡排序: Array.prototype.bubleSort= function(){ const arr = this; const len = arr.length; for(let i=0;i<len-1;i++){ for(let j=0;j<len-1-i;j++){ if(arr[j]>arr[j+1]){ let temp = arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } return arr; } [8,5,7,2].bubleSort() //[ 2, 5, 7, 8 ]

    另一种冒泡排序:

    Array.prototype.bubleSort= function(){ const arr = this; const len = arr.length; for(let i=len;i>1;i--){ for(let j=0;j<len-1;j++){ if(arr[j]>arr[j+1]){ [arr[j],arr[j+1]]=[arr[j+1],arr[j]] } } } return arr; } [8,5,7,2].bubleSort() //[ 2, 5, 7, 8 ] 选择排序 Array.prototype.selectSort = function(){ const arr = this; const len = arr.length; for(let i=0;i<len-1;i++){ for(let j=i+1;j < len;j++){ if (arr[i]>arr[j]){ [arr[i],arr[j]]=[arr[j],arr[i]] } } } return arr } [5,1,2,7,4].selectSort() //[ 1, 2, 4, 5, 7 ]

    终结篇


    [1,5,2,3].sort() //[ 1, 2, 3, 5 ] 默认是升序 [1,5,2,3].sort((a,b)=>b-a) //[ 5, 3, 2, 1 ]

    四、最大值

    开始篇


    先排序,再取值

    Array.prototype.selectSort = function(){ const arr = this; const len = arr.length; for(let i=0;i<len;i++){ for(let j =i+1;j<len;j++){ if(arr[i]>arr[j]){ [arr[i],arr[j]]=[arr[j],arr[i]] } } } return arr; } maxArray = function(array){ const len = array.length; return array.selectSort()[len-1] } maxArray([1,3,9,2,5]) //9

    终结篇


    Math.max(...[1,2,3,4]) //4 Math.max.apply(this,[1,2,3,4]) //4 [1,2,3,4].reduce((prev,cur)=>{ return Math.max(prev,cur) },0) //4

    五、求和

    开始篇


    function sum(arr){ const len = arr.length; if(len===0){ return 0 }else if(len===1){ return arr[0] }else { return arr[0] + sum(arr.slice(1)) } } sum([1,2,3,4])

    利用slice截取数组,再递归求和

    终结篇


    [1,2,3,4].reduce((a,b)=> a+b) //10

    六、合并

    开始篇


    [1,2,3,4].concat([5,6]) //[ 1, 2, 3, 4, 5, 6 ] [...[1,2,3,4],...[5,6]] //[ 1, 2, 3, 4, 5, 6 ]

    七、判断是否包含值

    开始篇


    [1,2,3].some(item=>{ return item===3 })

    终结篇


    [1,2,3].indexOf(3) //2 如果存在返回索引,不存在返回-1 [1,2,3].includes(3) //true [1,2,4,4,3].find(item=>item===3) //3 返回本身,如果不存在返回undefined [1,2,4,4,3].findIndex(item=>item===3) //4 返回索引,如果不存在返回-1

    八、类数组转化

    终结篇

    Array.from(new Set([1,2,3,4])) //[nodemon] starting `node z.js` [ 1, 2, 3, 4 ]

    开始篇


    九、每一项设置值

    开始篇


    [1,2,3].map(()=>0) //[ 0, 0, 0 ]

    终结篇


    [1,2,3].fill('a') //[ 'a', 'a', 'a' ]

    十、每一项是否满足

    [1,2,3].every(item=>item >2) //false

    十一、有一项满足

    [1,2,3].some(item=>item>2) //true

    十二、过滤数组

    [1,2,3].filter(item=>item>2) //[3]

    十三、对象和数组转化

    Object.keys({name:'张三',age:14}) //[ 'name', 'age' ] Object.values({name:'张三',age:14}) //[ '张三', 14 ] Object.entries({name:'张三',age:14}) //[ [ 'name', '张三' ], [ 'age', 14 ] ]
    最新回复(0)