美文网首页
开发中js常用函数(自用)

开发中js常用函数(自用)

作者: tysnd | 来源:发表于2021-04-08 17:19 被阅读0次

    获取对象数组中,某个属性的最小值

    // arr格式 
    [
      {
        price: 0,
        name: 'xxx'
      }
    ]
    // 求 arr中price的最小值
    arr.push({price: 0,name: ''}) // 若arr为空数组,则下面一行代码得出的结果为Infinity,因此要加一个理想的最小值
    arr.map(tmp => tmp.price).reduce((min, cur) => Math.min(min, cur), Infinity)
    

    随机生成[l, r]的整数

    randomInteger (l, r) {
      return Math.floor(Math.random() * (r - l + 1)) + l
    },
    

    时间戳转标准格式字符串

    getFormatTime (timeStamp) {
          let date = new Date(timeStamp)
          let y = date.getFullYear()
          let m = ('0' + (date.getMonth() + 1)).substr(-2)
          let d = ('0' + date.getDate()).substr(-2)
          let h = ('0' + date.getHours()).substr(-2)
          let i = ('0' + date.getMinutes()).substr(-2)
          let s = ('0' + date.getSeconds()).substr(-2)
          // console.log(y + '-' + m + '-' + d + ' ' + h + ':' + i + ':' + s)
          return y + '-' + m + '-' + d + ' ' + h + ':' + i + ':' + s
        }
    

    Date对象转标准格式字符串

    getFormatTime (date, delimiter = '-')  {
      return date.toLocaleDateString().split('/').map(cur => cur.length > 1 ? cur : '0' + cur).join(delimiter) + ' ' + date.toTimeString().substring(0, 8)
    }
    

    将数字每3位用逗号分隔

    直接用Number.toLocaleString()即可

    对象深拷贝

    适用于循环引用的对象,参考https://juejin.cn/post/6844903998823088141

    function deepCopy (obj, map) {
        if (typeof obj !== 'object') {
            return obj
        }
        let newObj = Array.isArray(obj) ? [] : {}
        if (map.get(obj)) {
            return map.get(obj)
        }
        map.set(obj, newObj)
        for (let key in obj) {
            if (obj.hasOwnProperty(key)) {
                newObj[key] = deepCopy(obj[key], map)
            }
        }
        return newObj
    }
    

    变量类型判断

    null、Array、Date等typeof都是object,所以不能直接使用typeof判定类型
    可以使用toString后的object xxx判定

    let class2type = {}
    'Array Date RegExp Object Error'.split(' ').forEach(e => class2type[ '[object ' + e + ']' ] = e.toLowerCase()) 
    
    function type(obj) {
        if (obj == null) return String(obj)
        return typeof obj === 'object' ? class2type[ Object.prototype.toString.call(obj) ] || 'object' : typeof obj
    }
    

    数组扁平化

    let arr = [
        [1, 2, 3],
        {4: 4},
        [5, [6, [{7: 7}]]],
        8
    ]
    // 方法一  递归
    function flat1 (arr) {
        let res = []
        for (let i = 0; i < arr.length; i++) {
            res = res.concat(Array.isArray(arr[i]) ? flat1(arr[i]) : arr[i])
        }
        return res
    }
    console.log(flat1(arr))
    
    // 方法二 reduce (原理同方法一,只是代码更简洁)
    function flat2 (arr) {
        return arr.reduce((pre, cur) => {
            console.log(pre)
            return pre.concat(Array.isArray(cur) ? flat2(cur) : cur)
        }, [])
    }
    console.log(flat2(arr))
    
    // 方法三  Array.flat
    let res = arr.flat(Infinity)
    console.log(res)
    
    // 方法四 generate+yield
    function* flat4(arr) {
      if (Array.isArray(arr)) {
        for (let i of arr) {
          yield* flat4(i)
        }
      } else {
        yield arr
      }
    }
    
    console.log([...flat4(arr)])
    
    

    数组去重

    let arr = [1,2,2,4,3,4,1,3,2,7,5,6,1]
    
    // 方法一
    let s = new Set(arr)
    let newArr1 = [...s]
    let newArr2 = Array.from(s)
    let newArr3 = []
    s.forEach(cur => {
        newArr3.push(cur)
    })
    console.log(newArr1, newArr2, newArr3)
    
    // 方法二
    let arr2 = []
    arr.forEach(cur => {
        if (arr2.indexOf(cur) === -1) {
            arr2.push(cur)
        }
    })
    console.log(arr2)
    
    // 方法三
    for (let i = 0; i < arr.length; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[i] === arr[j]) {
                arr.splice(j, 1)
            }
        }
    }
    console.log(arr)
    
    
    

    相关文章

      网友评论

          本文标题:开发中js常用函数(自用)

          本文链接:https://www.haomeiwen.com/subject/ebevkltx.html