Skip to content

手写常用方法 ​

手写debounce ​

js
function debounce(fn, wait) {
    let timer = null
    return function (...args) {
        clearTimeout(timer)
        timer = setTimeout(() => {
            fn.apply(this, args) // 需要保证fn内的this指向于函数调用者
        }, wait)
    }
}

手写throttle ​

js
function throttle(fn, wait) {
    let timer = new Date().getTime()
    return function (...args) {
        let now = new Date().getTime()
        if (now > timer + wait) {
            fn.apply(this, args) // 需要保证fn内的this指向于函数调用者
            timer = now
        }
    }
}

数组拍平flat ​

  • 方式1:
js
function flat(listTree) {
    // return list.flat(Infinity)
    return listTree.reduce((a, b) => a.concat(Array.isArray(b) ? flat(b): b), [])
}
// 测试
let listTree = [1,2,[3,[4,5]]]
console.log(flat(listTree))
  • 方式2:
js
function flat(listTree) {
    let res = []
    let stack = [...listTree]
    while (stack.length > 0) {
        let cur = stack.pop()
        if (Array.isArray(cur)) {
            stack.push(...cur)
        } else {
            res.push(cur)
        }
    }
    return res.reverse()
}

对象拍平flatten ​

将:{a: {b: 1, c: 2, d: [3,4]}, b: [1,2]} 转换为:{ 'a.b': 1, 'a.c': 2, 'a.d': [ 3, 4 ], b: [ 1, 2 ] }

js

function flatten(obj) {
    let res = {}
    function dfs(pre, cur) {
        if (typeof cur === 'object' && cur) {
            if (Array.isArray(cur)) {
                res[pre] = cur
            } else {
                for (let key in cur) {
                     dfs(pre? `${pre}.${key}` :key, cur[key])
                }
            }
        } else {
            res[pre] = cur
        }
    }
    dfs('', obj)
    return res
}
// 测试
let obj = {a: {b: 1, c: 2, d: [3,4]}, b: [1,2]}
console.log(flatten(obj))

手写get方法查找属性 ​

var obj = {a: {b: {c: 2}}};
get(obj, 'a.b.c') // 输出 2

js
function get(obj, path) {
    let pathList = path.split('.')
    let cur = obj
    for (let key of pathList) {
        if (cur[key] !== undefined) {
            cur = cur[key]
        } else {
            return undefined
        }
    }
    return cur
}
// 测试
var obj = {a: {b: {c: 2}}};
console.log(get(obj, 'a.b'))

对象转数组 ​

js
function treeToList(tree, pid) {
    let list = []
    for (let obj of tree) {
        let {children, ...current} = obj
        current['parentId'] = pid
        list.push(current)
        if (children) {
            list = list.concat(treeToList(children, obj.id))
        }
    }
    return list
}
// 测试
const tree2 = [
    {
        id: 1,
        text: '节点1',
        children: [
            {
                id: 2,
                text: '节点1_1',
            }
        ]
    }
];

console.log(treeToList(tree2, 0))

数组转对象 ​

js
function listToTree(list, pid) {
    let tree = []
    for(let item of list) {
        if (pid === item.parentId) {
            tree.push({
                ...item,
                children: listToTree(list, item.id)
            })
        }
    }
    return tree
}
// 测试
let list = [
    {
        id: 1,
        text: '节点1',
        parentId: 0 //这里用0表示为顶级节点
    },
    {
        id: 2,
        text: '节点1_1',
        parentId: 1 //通过这个字段来确定子父级
    }
]
console.log(JSON.stringify(listToTree(list, 0)))

对象的key下划线转驼峰 ​

js
function underLineToHump(obj) {
    let newObj = Array.isArray(obj) ? []:{}
    for (let key in obj) {
        let newKey = key.replace(/_([a-z])/g, (match, p1) => {
            return match[1].toUpperCase()
        })
        if (typeof obj[key] === 'object' && obj[key]) {
            newObj[newKey] = underLineToHump(obj[key])
        } else {
            newObj[newKey] = obj[key]
        }
    }
    return newObj
}
// 测试
let obj = {
    hello_world: {
        ni_hao: ['a_b', {a_c: 2}]
    },
    java_script: 1,
    is_null: null
}
console.log(underLineToHump(obj))

手写千分位 ​

-123345.1234 => -123,345.1234

js
function format(str) {
    let pre = str.split('.')[0]
    // 将整数部分逆序
    let preReverse = pre.replace('-', '').split('').reverse().join('')
    let list = []
    for (let i = 0;i< preReverse.length; i++) {
        if (i % 3 === 0 && i !== 0) {
            list.unshift(',')
        }
        list.unshift(preReverse[i])
    }

    let decimalPart = str.split('.')[1] // 小数部分
    return (str.startsWith('-') ? '-': '') + list.join('') + (decimalPart ? '.'+decimalPart : '')
}
// 测试
console.log(format('-123345.1234'))