javaScript常见手写算法题(前端笔记一)

1.  获取url参数

function getUrlParams (url) {
    const res = {}
    if(url.includes('?')){
        const str = url.split('?')[1]  //取?号后面部分
        const arr = str.split('&')  //按=将携带参数分割成数组形式
        //遍历数组
        arr.forEach(item => { 
            const key = item.split('=')[0]   //取等号前面为键
            const val = item.split('=')[1]   //取等号后面为值
            res[key] = decodeURIComponent(val) //解码,赋值
        })
    }
    return res
}

//测试
let url = 'https://baidu.com?name=zhangsan&age=18'

let res = getUrlParams (url)

console.log(res)

//{ name: 'zhangsan', age: '18'}

2. 数组去重

let arr = [2, 2, 3, 4, 5, 5, 9, 7, 1, 0, 0]

//方式一:Set + 拓展运算符
let newArr = [...new Set(arr)]
console.log(newArr)    // [2,3,4,5,9,7,1,0]

//方法二: filter + indexOf
let newArr2 = arr.filter( (item, index) => {
    return arr.indexOf(item) === index
})
console.log(newArr2)    // [2,3,4,5,9,7,1,0]

//方法三: for循环 + includes
let newArr3 = []
for(let i = 1; i < arr.length; i++){
    if(!newArr3.includes(arr[i])){
        newArr3.push(arr[i])
    }
}
console.log(newArr3)    // [2,3,4,5,9,7,1,0]

//方法四: forEach + indexof
function resetArr (arr) {
    let res = []
    arr.forEach(item => {
        if(res.indexOf(item) === -1){
            res.push(item)
        }
    })
    return res
}
console.log(resetArr(arr))    // [2,3,4,5,9,7,1,0]

3. 数组扁平化

let arr = [1, [2, 3, [4, 5]], [7, 9]]

方法一:flat
let newArr = arr.flat([Infinity])
console.log(newArr)    //[1,2,3,4,5,7,9]

方法二:转字符串 + map(Number)
//map(Number)是将字符串型数组转化成数字型数组
//map(String)是将数字型数组转化成字符串型数组
let newArr2 = arr.toString().split(',').map(Number)
console.log(newArr2)    //[1,2,3,4,5,7,9]

方法三:some + concat
function flatDeep(arr) {
    while (arr.some(item => Array.isArray(item))) {
        arr = [].concat(...arr)
    }
    return arr
}
console.log(flatDeep(arr))    //[1,2,3,4,5,7,9]

方法四:reduce
function flatArr (arr) {
    return arr.reduce( (pre,next) => {
        return pre.concat(Array.isAarray(next) ? flatArr(next) : next)
    }, [])
}
console.log(flatArr(arr))    //[1,2,3,4,5,7,9]

4. 深拷贝

let obj = {
  a: "b",
  c: [1, 4, 6],
  d: { f: "e" },
  // g: function () {
  //   console.log('11');
  // }
}
let arr = [
  { a: "b" },
  {c: "d", e:"f"}
]

//方法一: JSON
let newobj = JSON.parse(JSON.stringify(obj))
let newarr = JSON.parse(JSON.stringify(arr))
//注意事项:对象中若含有方法,如g,则无法被拷贝

//方法二: 递归
function deepClone (obj) {
    //先判断传入参数是对象还是数组,然后相应的赋初始值
    let res = Array.isArray(obj) ? [] : {} 
    if(obj && typeOf obj === "object"){
        for( const key in obj ) {
            if(obj.hasOwnProperty(key)){
                //判断对象键有没有自身属性
                if(obj[key] && typeOf obj[key] === "object"){
                    res[key] = deepClone(obj[key])
                }else{
                    res[key] = obj[key]
                }
            }
        }
    }
    return res
}

let cloneobj = deepClone(obj)
console.log(cloneobj)
let clonearr = deepClone(arr)
console.log(clonearr)

5.冒泡排序

let arr = [3,6,1,5,7,2,0]
//双重for循环
function bubbleSort(arr){
    let len = arr.length
    for(let i = 1; i < len-1, i++){
        for(let j = 1; 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
}

console.log(bubbleSort(arr))    //[0,1,2,3,5,6,7]

后面不定期更新中。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值