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

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

// 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常用函数(自用))