* 參數(shù):
* time: [String] 給定日期 yyyy-MM-dd
* itervalByDay: [Number] 相隔工作日
* separator: [String] 年月日分隔符
* 返回:
* rq:[String] 匹配的日期yyyy-MM-dd
var getworkday = function(time, itervalByDay, separator = '-'){
var str = time.split("-");
var date = getDate();
date.setUTCFullYear(str[0], str[1] - 1, str[2]);
date.setUTCHours(0, 0, 0, 0);
var millisceonds =date.getTime();
for(var i = 1; i <= itervalByDay; i++){
millisceonds += 24 * 60 * 60 * 1000;
date.setTime(millisceonds);
// 如果是周末,計(jì)數(shù)i回退1,既跳過
if(date.getDay() == 0 || date.getDay() == 6) i--;
}
var year = date.getFullYear();
var month = (date.getMonth() + 1);
var day = date.getDate();
var rq = year + separator + month + separator + day;
return rq;
}
* 參數(shù):
* url: [String] 解析的URL,可選,不傳該值默認(rèn)本地href
* 返回:
* obj:[Object] 參數(shù)集合對(duì)象
function getQueryParam(url) {
const href = url || window.location.href;
let args = href.split('?');
// 沒有參數(shù)直接返回{}
if (args[0] === href) {
return {};
}
var hrefarr = args[1].split('#')[0].split('&');
var obj = {};
for (var i = 0; i < hrefarr.length; i++) {
hrefarr[i] = hrefarr[i].split('=');
obj[hrefarr[i][0]] = hrefarr[i][1];
}
return obj;
}
* 參數(shù):
* date: 時(shí)間戳 [Date]
* isTime: 是否返回具體時(shí)間 [Boolean]
* separator: 年月日分隔符 [String]
* 返回:
* isTime: false => yyyy-MM-dd [String]
* isTime: true => yyyy-MM-dd HH:mm:ss [String]
const formatDate = (date, isTime = false, separator = '-') => {
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
let d = [year, month, day].map(_formatNumber).join(separator)
if (isTime) {
const hour = date.getHours()
const minute = date.getMinutes()
const second = date.getSeconds()
const time = [hour, minute, second].map(_formatNumber).join(':')
d = `$squ6kqw ${time}`
}
return d
}
const _formatNumber = n => {
n = n.toString()
return n[1] ? n : '0' + n
}
// padStart()補(bǔ)齊日期位數(shù)
formatDate() {
const date = new Date()
const year = date.getFullYear().toString().padStart(4, '0')
const month = (date.getMonth() + 1).toString().padStart(2, '0')
const day = date.getDate().toString().padStart(2, '0')
const result = `${year}-${month}-${day}`
return result
}
* 參數(shù):
* IdCard: [String] 身份證號(hào)碼
* type: [Number] 1/2/3
* 返回:
* type:1 => birthday [String] 出生日期
* type:2 => sex [Number] 性別
* type:3 => age [Number] 年齡
formatIdCard (IdCard, type) {
if (type === 1) {
// 獲取出生日期
var birthday = IdCard.substring(6, 10) + '-' + IdCard.substring(10, 12) '-' + IdCard.substring(12, 14)
return birthday
}
if (type === 2) {
// 獲取性別
if (parseInt(IdCard.substr(16, 1)) % 2 === 1) {
return '1' // 男
} else {
return '2' // 女
}
}
if (type === 3) {
// 獲取年齡
var ageDate = new Date()
var month = ageDate.getMonth() + 1
var day = ageDate.getDate()
var age = ageDate.getFullYear() - IdCard.substring(6, 10) - 1
if (IdCard.substring(10, 12) < month || IdCard.substring(10, 12) === mont&& IdCard.substring(12, 14) <= day) {
age++
}
if (age <= 0) {
age = 1
}
return age
}
}
* 1.輸出完整接口日志
* 2.統(tǒng)一配置請(qǐng)求頭、響應(yīng)參數(shù)
* 3.統(tǒng)一管理請(qǐng)求響應(yīng)操作(成功、失敗)
request ({
url,
header,
data = {},
code = 'errCode', // 接口返回的業(yè)務(wù)標(biāo)識(shí)
method = 'POST',
dataType = 'json',
timeout = ,
success = () => {},
fail = () => {},
complete = () => {}
}) {
wx.showLoading({ title: '正在加載中', mask: true })
return wx.request({
url,
data,
method,
header: {
'content-type': 'application/json',
token: this.globalData.token,
...header,
},
timeout,
complete: res => {
wx.hideLoading()
// 打印信息
console.log('');
console.group(`---- ${url} ----`)
console.log('Params', data)
console.log('Header', {
'content-type': 'application/json',
token: this.globalData.token,
...header,
})
console.log('Response', res)
console.info(`#### ${url} ####`)
console.groupEnd()
complete(res)
// 返回成功
if (res.data && +res.data[code] === 1) {
return success(res.data)
}
// 返回錯(cuò)誤
fail(res.data)
}
})
}
* 參數(shù):
* file {file object} 文件對(duì)象
* 返回:
* {Promise}
async function imgToBase64 (file) {
return new Promise((resolve,reject) => {
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = e => {
resolve(e.target.result)
}
reader.onerror = err => {
reject(err)
}
})
}
* 原理: 把圖片寬度、高度調(diào)小
* @param file {file object | file base64}
* @param {width, height}:壓縮圖片寬高
* @returns {Promise}
*
* Tip: 與imgToBase64()配合使用效果更佳
async function imgToCompressed (file, {
width,
height
}) {
if (typeof file === 'object') {
file = await imgToBase64(file)
}
return new Promise(resolve => {
var image = new Image()
image.src = file
image.onload = () => {
const _width = image.width
const _height = image.height
const canvas = document.createElement('canvas')
const context = canvas.getContext('2d')
let data = ''
if (width && width > _width) {
width = _width
height = _height
} else {
// 等比例縮放
width = width || Math.floor(_width * height / _height)
height = height || Math.floor(width * _height / _width)
}
canvas.width = width
canvas.height = height
context.drawImage(image, 0, 0, width, height)
data = canvas.toDataURL('image/jpeg').replace('data:image/jpeg;base64,', '')
resolve(data)
}
})
}
// 模糊搜索
function searchList() {
const search = this.search
const pageIndex = this.pageIndex
const pageSize = this.pageSize
if (search) {
// filter() 方法創(chuàng)建一個(gè)新的數(shù)組,新數(shù)組中的元素是通過檢查指定數(shù)組中符合條件的所有元素。
// 注意: filter() 不會(huì)對(duì)空數(shù)組進(jìn)行檢測(cè)。
// 注意: filter() 不會(huì)改變?cè)紨?shù)組。
return this.list.filter(data => {
// some() 方法用于檢測(cè)數(shù)組中的元素是否滿足指定條件;
// some() 方法會(huì)依次執(zhí)行數(shù)組的每個(gè)元素:
// 如果有一個(gè)元素滿足條件,則表達(dá)式返回true , 剩余的元素不會(huì)再執(zhí)行檢測(cè);
// 如果沒有滿足條件的元素,則返回false。
// 注意: some() 不會(huì)對(duì)空數(shù)組進(jìn)行檢測(cè)。
// 注意: some() 不會(huì)改變?cè)紨?shù)組。
return Object.keys(data).some(key => {
// indexOf() 返回某個(gè)指定的字符在某個(gè)字符串中首次出現(xiàn)的位置,如果沒有找到就返回-1;
// 該方法對(duì)大小寫敏感!所以之前需要toLowerCase()方法將所有查詢到內(nèi)容變?yōu)樾憽? return (String(data[key]).toLowerCase().indexOf(search) > -1).slice((pageIndex - 1) * pageSize, pageIndex * pageSize)
})
})
}
return this.list
}
* 判斷數(shù)據(jù)類型方法
* @param {any} data 待判斷類型的數(shù)據(jù)
* @returns {string}
const _typeof = function (data) {
const value = /\[object (\w+)\]/.exec(
Object.prototype.toString.call(data)
);
return value ? value[1].toLowerCase() : '';
}
// 簡(jiǎn)化版-判斷效果一致
const _typeof = function (data) {
return Object.prototype.toString.call(data).slice(8, -1)
}
// Test
_typeof('123') //"string"
_typeof(123) //"number"
_typeof(123n) //"bigint"
_typeof(null) //"null"
_typeof(undefined) //"undefined"
_typeof({}) //"object"
_typeof([]) //"array"
_typeof(/123/) //"regexp"
* base64解碼
* 優(yōu)化中文亂碼問題
* @param {String} b64Str 待解碼的base64數(shù)據(jù)
* @returns {string}
function b64ToUtf8(b64Str) {
return decodeURIComponent(window.atob(b64Str).split('').map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join(''))
}
// atob()解碼不支持中文
// base64編碼前先對(duì)中文URL轉(zhuǎn)碼
window.btoa(encodeURIComponent(str))
* 冒泡排序
* 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè),對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)。
* @param {Array} arr 待排序的數(shù)組
* @returns {Array}
function bubbleSort(arr) {
const len = arr.length
for (var i = 0; i < n; i++) {
// 每次冒泡完畢,右側(cè)新固定一個(gè)較大值
for (var j = 1; j < n - i; j++) {
// 比較,交換大的于右側(cè)
if (arr[j - 1] > arr[j]) {
[arr[j - 1], arr[j]] = [arr[j], arr[j - 1]]
}
}
}
return arr
}
bubbleSort([5, 2, 4, 6, 1, 3]) // 輸出[1, 2, 3, 4, 5, 6]
// 常見優(yōu)化方法
// 1.添加交換記錄標(biāo)志
// 用于標(biāo)志某一趟排序過程中是否有數(shù)據(jù)交換,如果進(jìn)行某一趟排序時(shí)并沒有進(jìn)行數(shù)據(jù)交換,則說明數(shù)據(jù)已經(jīng)按要求排列好,可立即結(jié)束排序,避免不必要的比較過程。
專業(yè)從事做網(wǎng)站、成都做網(wǎng)站,高端網(wǎng)站制作設(shè)計(jì),微信小程序開發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠服務(wù),采用H5開發(fā)+CSS3前端渲染技術(shù),響應(yīng)式網(wǎng)站,讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項(xiàng)小組,與您實(shí)時(shí)在線互動(dòng),隨時(shí)提供解決方案,暢聊想法和感受。
* 插入排序
* 插入排序的工作方式像許多人排序一手撲克牌,拿一張牌依次對(duì)比手上的牌組然后插入到牌組合適位置,重復(fù)直至最后一張。
* @param {Array} arr 待排序的數(shù)組
* @returns {Array}
function insertionSort(arr) {
// 手上牌組
let newArr = [arr[0]]
let len = arr.length
// 從左邊開始,每次拿一個(gè)與已排列好的數(shù)組進(jìn)行比較
for (let i = 1; i < len; i++) {
for (let j = 0; j < i; j++) {
// 若拿的牌小于手上某張牌,則插入該牌前方
if (arr[i] <= newArr[j]) {
newArr.splice(j, 0, arr[i])
break
}
// 若拿的牌比最后一張都還大,則排在最后(注意:i = newArr.length)
if (j === i - 1) {
newArr.push(arr[i])
}
}
}
return newArr
}
insertionSort([5, 2, 4, 6, 1, 3]) // 輸出[1, 2, 3, 4, 5, 6]
* 順序/逆序 排序
* @param {Array} arr 待排序的數(shù)組
* @returns {Array}
function _sort(arr) {
return arr.sort((a,b) => {
return a - b
// return b - a 逆序
})
}
_sort([1, 4, 2]) // 輸出[1, 2, 4]
* 選擇排序
* 首先在未排序序列中找到最?。ù螅┰兀娣诺脚判蛐蛄械钠鹗嘉恢?。再從剩余未排序元素中繼續(xù)尋找最?。ù螅┰?,然后放到已排序序列的末尾。
* @param {Array} arr 待排序的數(shù)組
* @returns {Array}
function selectionSort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { // 尋找最小的數(shù)
minIndex = j; // 將最小數(shù)的索引保存
}
}
// 索引沒改變則表明當(dāng)前項(xiàng)位置正確,無需變換位置
if(minIndex === i) continue
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
}
return arr
}
selectionSort([5, 2, 4, 6, 1, 3]) // 輸出[1, 2, 3, 4, 5, 6]