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

总结前端面试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 ] ]
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值