/* eslint no-param-reassign: 0 */
/* eslint no-control-regex: 0 */
/* eslint no-restricted-syntax: 0 */
/* eslint no-prototype-builtins: 0 */
/* eslint no-continue: 0 */
export function parseTime(time, cFormat) {
if (arguments.length === 0) {
return null;
}
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}';
let date;
if (typeof time === 'object') {
date = time;
} else {
if ((`${time}`).length === 10) time = parseInt(time, 10) * 1000;
date = new Date(time);
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay(),
};
const timeStr = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
let value = formatObj[key];
if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1];
if (result.length > 0 && value < 10) {
value = `0${value}`;
}
return value || 0;
});
return timeStr;
}
export function formatTime(time, option) {
time = +time * 1000;
const d = new Date(time);
const now = Date.now();
const diff = (now - d) / 1000;
if (diff < 30) {
return '刚刚';
} else if (diff < 3600) { // less 1 hour
return `${Math.ceil(diff / 60)}分钟前`;
} else if (diff < 3600 * 24) {
return `${Math.ceil(diff / 3600)}小时前`;
} else if (diff < 3600 * 24 * 2) {
return '1天前';
}
if (option) {
return parseTime(time, option);
}
return `${d.getMonth() + 1}月${d.getDate()}日${d.getHours()}时${d.getMinutes()}分`;
}
// 格式化url参数
export function getQueryObject(url) {
url = url == null ? window.location.href : url;
const search = url.substring(url.lastIndexOf('?') + 1);
const obj = {};
const reg = /([^?&=]+)=([^?&=]*)/g;
search.replace(reg, (rs, $1, $2) => {
const name = decodeURIComponent($1);
let val = decodeURIComponent($2);
val = String(val);
obj[name] = val;
return rs;
});
return obj;
}
/**
*get getByteLen
* @param {Sting} val input value
* @returns {number} output value
*/
export function getByteLen(val) {
let len = 0;
for (let i = 0; i < val.length; i += 1) {
if (val[i].match(/[^\x00-\xff]/ig) != null) {
len += 1;
} else { len += 0.5; }
}
return Math.floor(len);
}
export function cleanArray(actual) {
const newArray = [];
for (let i = 0; i < actual.length; i += 1) {
if (actual[i]) {
newArray.push(actual[i]);
}
}
return newArray;
}
export function param(json) {
if (!json) return '';
return cleanArray(Object.keys(json).map((key) => {
if (json[key] === undefined) return '';
return `${encodeURIComponent(key)}=${
encodeURIComponent(json[key])}`;
})).join('&');
}
export function param2Obj(url) {
const search = url.split('?')[1];
if (!search) {
return {};
}
return JSON.parse(`{"${decodeURIComponent(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"')}"}`);
}
export function html2Text(val) {
const div = document.createElement('div');
div.innerHTML = val;
return div.textContent || div.innerText;
}
export function objectMerge(target, source) {
/* Merges two objects,
giving the last one precedence */
if (typeof target !== 'object') {
target = {};
}
if (Array.isArray(source)) {
return source.slice();
}
for (const property in source) {
if (source.hasOwnProperty(property)) {
const sourceProperty = source[property];
if (typeof sourceProperty === 'object') {
target[property] = objectMerge(target[property], sourceProperty);
continue;
}
target[property] = sourceProperty;
}
}
return target;
}
export function scrollTo(element, to, duration) {
if (duration <= 0) return;
const difference = to - element.scrollTop;
const perTick = (difference / duration) * 10;
setTimeout(() => {
element.scrollTop += perTick;
if (element.scrollTop === to) return;
scrollTo(element, to, duration - 10);
}, 10);
}
export function toggleClass(element, className) {
if (!element || !className) {
return;
}
let classString = element.className;
const nameIndex = classString.indexOf(className);
if (nameIndex === -1) {
classString += `${className}`;
} else {
classString = classString.substr(0, nameIndex) + classString.substr(nameIndex + className.length);
}
element.className = classString;
}
export function getTime(type) {
if (type === 'start') {
return new Date().getTime() - (3600 * 1000 * 24 * 90);
}
return new Date(new Date().toDateString());
}
export function deepClone(source) {
if (!source && typeof source !== 'object') {
throw new Error('error arguments', 'shallowClone');
}
const targetObj = source.constructor === Array ? [] : {};
for (const keys in source) {
if (source.hasOwnProperty(keys)) {
if (source[keys] && typeof source[keys] === 'object') {
targetObj[keys] = source[keys].constructor === Array ? [] : {};
targetObj[keys] = deepClone(source[keys]);
} else {
targetObj[keys] = source[keys];
}
}
}
return targetObj;
}
export function subCurry(fn, ...rest) {
return (...args) => fn.apply(this, rest.concat(args));
}
export function curry(fn, length) {
length = length || fn.length;
return (...args) => {
if (args.length < length) {
const argLength = args.length;
const combined = [fn].concat(args);
return curry(subCurry.apply(this, combined), length - argLength);
}
return fn.apply(this, args);
};
}
export function compose(...rest) {
return (...args) => {
let i = rest.length - 1;
let result = rest[i].apply(this, args);
while (i) {
i -= 1;
result = rest[i].call(this, result);
}
return result;
};
}
// 阻止频繁点击
export function duplicateClick(context, delay = 500) {
if (context.clickTag !== 0) {
return Promise.reject();
}
context.clickTag += 1;
if (context.clickTimer) {
clearTimeout(context.clickTimer);
}
context.clickTimer = setTimeout(() => { context.clickTag = 0; }, delay);
return Promise.resolve();
}
// 清空前后空格
export const spaceBlur = (value, isTextarea) => {
let notspaceReg = /(^\s*)|(\s*$)/g;
if (isTextarea && value) {
notspaceReg = /(\s*$)/g;
}
return value.replace(notspaceReg, '');
};
// 去掉首尾空格
export const spaceName = (form, name, value) => {
this[form][name] = spaceBlur(value);
};
// 首字母大写
export function firstUpperCase(str) {
return str.toLowerCase().replace(/( |^)[a-z]/g, L => L.toUpperCase());
}
/* 动态创建script标签 start */
/**
* 移除script标签
* @param scriptEl script dom
*/
const removeScript = function (scriptEl) {
document.body.removeChild(scriptEl);
};
const createScript = function (url, id) {
if (document.getElementById(id)) {
removeScript(document.getElementById(id));
}
const scriptEl = document.createElement('script');
scriptEl.setAttribute('id', id);
document.body.appendChild(scriptEl);
const promise = new Promise((resolve, reject) => {
scriptEl.addEventListener('load', (e) => {
resolve(e);
}, false);
scriptEl.addEventListener('error', (e) => {
removeScript(scriptEl);
reject(e);
});
});
scriptEl.src = url;
return promise;
};
// 生产环境单文件引入js
export function remoteScript(url, id) {
return createScript(url, id);
}
/* 动态创建script标签 end */
// 取两个日期中所有日期
export function getDiffDate(stime, etime, seperator) {
if (seperator === null || seperator === undefined) {
seperator = '/';
}
const set = new Set();
let begin = stime.substr(0, 4).concat(seperator, stime.substr(5, 2), seperator, stime.substr(8, 2));
const end = etime.substr(0, 4).concat(seperator, etime.substr(5, 2), seperator, etime.substr(8, 2));
while (begin < end) {
set.add(begin);
const nextDate = new Date(new Date(begin).getTime() + (24 * 60 * 60 * 1000));
const y = nextDate.getFullYear();
const mTmp = nextDate.getMonth() + 1;
const m = (mTmp < 10) ? '0'.concat(mTmp) : mTmp;
const d = (nextDate.getDate() < 10) ? '0'.concat(nextDate.getDate()) : nextDate.getDate();
begin = String(y).concat(seperator, m, seperator, d);
}
return set;
}