heibao-utils
Version:
javasript develop utils
461 lines (449 loc) • 15.6 kB
JavaScript
"use strict";
var class2type = require("../var/class2type");
var getProto = require("../var/getPrototypeOf");
var hasOwn = require("../var/hasOwnPrototype");
var array = require("../var/array");
var push = require("../var/push");
var indexOf = require("../var/indexOf");
var fnToString = require("../var/fnToString");
var objectFunctionString = require("../var/objectFunctionString");
var types = ["Boolean", "Number", "String", "Function", "Array", "Date", "RegExp", "Object", "Error", "Symbol"];
types.map(function (name) {
class2type["[object " + name + "]"] = name.toLowerCase();
});
module.exports = {
type: function (obj) {
if (obj == null) {
return obj + "";
}
return typeof obj === "object" || typeof obj === "function" ?
class2type[toString.call(obj)] || "object" :
typeof obj;
},
isNull: function (obj) {
return obj === null || typeof obj === "undefined";
},
isPlainObject: function (obj) {
var proto, Ctor;
if (!obj || toString.call(obj) !== "[object Object]") {
return false;
}
proto = getProto(obj);
if (!proto) {
return true;
}
Ctor = hasOwn.call(proto, "constructor") && proto.constructor;
return typeof Ctor === "function" && fnToString.call(Ctor) === objectFunctionString;
},
isEmptyObject: function (obj) {
var name;
for (name in obj) {
return false;
}
return true;
},
isFunction: function (obj) {
return this.type(obj) === "function";
},
isNumeric: function (obj) {
var type = this.type(obj);
return (type === "number" || type === "string") &&
// parseFloat NaNs numeric-cast false positives ("")
// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
// subtraction forces infinities to NaN
!isNaN(obj - parseFloat(obj));
},
isArray: function (obj) {
return this.type(obj) == "array";
},
isBoolean: function (obj) {
return this.type(obj) == "boolean";
},
isDate: function (obj) {
return this.type(obj) == "date";
},
contain: function (elem, array, i) {
return array == null ? -1 : indexOf.call(array, elem, i);
},
merge: function (first, second) {
var len = +second.length,
j = 0,
i = first.length;
for (; j < len; j++) {
first[i++] = second[j];
}
first.length = i;
return first;
},
trim: function (text) {
return text == null ?
"" : (text + "").replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "");
},
// results is for internal usage only
makeArray: function (arr, results) {
var ret = results || [];
if (arr != null) {
if (this.isArrayLike(Object(arr))) {
this.merge(ret,
typeof arr === "string" ?
[arr] : arr
);
} else {
push.call(ret, arr);
}
}
return ret;
},
isWindow: function (obj) {
return obj != null && obj === obj.window;
},
isArrayLike: function (obj) {
var length = !!obj && "length" in obj && obj.length,
type = this.type(obj);
if (type === "function" || this.isWindow(obj)) {
return false;
}
return type === "array" || length === 0 ||
typeof length === "number" && length > 0 && (length - 1) in obj;
},
unique: function (arr) {
var res = [];
var json = {};
for (var i = 0; i < arr.length; i++) {
if (!json[arr[i]]) {
res.push(arr[i]);
json[arr[i]] = 1;
}
}
return res;
},
findElementIndex: function (arr, element) {
for (var i = 0; i < arr.length; i++) {
if (Object.prototype.toString.call(arr[i]) == "[object Object]") {
for (var key in arr[i]) {
if (key == element) {
return i;
}
}
} else if (element === arr[i]) {
return i;
}
}
return -1;
},
removeElement: function (array, element) {
var n = this.findElementIndex(array, element);
if (n < 0) {
return array;
} else {
return array.splice(n, 1); //this.slice(0, n).concat(this.slice(n + 1, this.length));
}
},
copyDate: function (date) {
try {
var newDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
newDate.setHours(date.getHours());
newDate.setMinutes(date.getMinutes());
newDate.setSeconds(date.getSeconds());
newDate.setMilliseconds(date.getMilliseconds());
return newDate;
} catch (e) {
throw "invalidDate";
}
},
/**
* 创建正确的Date对象
* @param strFormatDate 日期字符串,支持格式
* 2017-11-19 12:20:30:333
* 2017/11/19 12:20:30:333
* 2017.11.19 12:20:30:333
* 2017-11-19
* 2017/11/19
* 2017.11.19
* @param dateArr 时、分、秒数组,格式
* [23,59,59]
*/
createCorrectDate: function (strFormatDate, dateArr) {
if (strFormatDate == undefined || strFormatDate == null || strFormatDate == '') return 'invalidDate';
var dateObj;
dateArr = dateArr || [];
try {
var dateArray;
if (strFormatDate.indexOf(":") > -1) {
var dateStrSplit = strFormatDate.toString().split(" ");
strFormatDate = dateStrSplit[0];
if (dateArr.length <= 0) dateArr = dateStrSplit[1].split(":")
}
if (strFormatDate.indexOf('-') > -1) {
dateArray = strFormatDate.toString().split('-');
dateObj = new Date(Number(dateArray[0]), Number(dateArray[1]) - 1, Number(dateArray[2]));
if (Number(dateArray[0]) != dateObj.getFullYear())
return 'invalidDate';
if (Number(dateArray[1]) != dateObj.getMonth() + 1)
return 'invalidDate';
if (Number(dateArray[2]) != dateObj.getDate())
return 'invalidDate';
} else if (strFormatDate.indexOf('.') > -1) {
dateArray = strFormatDate.toString().split('.');
dateObj = new Date(Number(dateArray[0]), Number(dateArray[1]) - 1, Number(dateArray[2]));
if (Number(dateArray[0]) != dateObj.getFullYear())
return 'invalidDate';
if (Number(dateArray[1]) != dateObj.getMonth() + 1)
return 'invalidDate';
if (Number(dateArray[2]) != dateObj.getDate())
return 'invalidDate';
} else if (strFormatDate.indexOf('/') > -1) {
dateArray = strFormatDate.toString().split('/');
dateObj = new Date(Number(dateArray[0]), Number(dateArray[1]) - 1, Number(dateArray[2]));
if (Number(dateArray[0]) != dateObj.getFullYear())
return 'invalidDate';
if (Number(dateArray[1]) != dateObj.getMonth() + 1)
return 'invalidDate';
if (Number(dateArray[2]) != dateObj.getDate())
return 'invalidDate';
}
for (var i = 0; i < dateArr.length; i++) {
switch (i) {
case 0:
dateObj.setHours(dateArr[0]);
if (dateObj.getHours() != Number(dateArr[0]))
return 'invalidDate';
break;
case 1:
dateObj.setMinutes(dateArr[1]);
if (dateObj.getMinutes() != Number(dateArr[1]))
return 'invalidDate';
break;
case 2:
dateObj.setSeconds(dateArr[2]);
if (dateObj.getSeconds() != Number(dateArr[2]))
return 'invalidDate';
break;
case 3:
dateObj.setMilliseconds(dateArr[3]);
if (dateObj.getMilliseconds() != Number(dateArr[3]))
return 'invalidDate';
default:
break;
}
}
if (dateArr.length <= 0) {
dateObj.setHours(0);
dateObj.setMinutes(0);
dateObj.setSeconds(0);
dateObj.setMilliseconds(0);
}
return dateObj;
} catch (e) {
return 'invalidDate';
}
},
dateFormat: function (fmt, objDate) {
var o = {
"M+": objDate.getMonth() + 1, //月份
"d+": objDate.getDate(), //日
"h+": objDate.getHours(), //小时
"m+": objDate.getMinutes(), //分
"s+": objDate.getSeconds(), //秒
"q+": Math.floor((objDate.getMonth() + 3) / 3), //季度
"S": objDate.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (objDate.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
},
isLeapYear: function (objDate) {//判断闰年
var pYear = objDate.getFullYear();
if (!isNaN(parseInt(pYear))) {
if ((pYear % 4 == 0 && pYear % 100 != 0) || (pYear % 100 == 0 && pYear % 400 == 0)) {
return true;
} else {
return false;
}
} else {
return false;
}
},
/***************************************************
*比较两个日期的间隔
*参数说明:
* @param interval要返回的两个日期的间隔,比如:
* s:返回两个日期相差的秒数
* n:返回两个日期相差的分钟数
* h:返回两个日期相差的小时数
* d:返回两个日期相差的天数
* w:返回两个日期相差的周数
* m:返回连个日期相差的月数
* y:返回连个日期相差的年数
* @param beginDate:开始日期
* @param endDate:结束日期
****************************************************/
diffDate: function (interval, beginDate, endDate) {
var dtBegin;
var dtEnd;
try {
if (Object.prototype.toString.call(beginDate) == "[object Date]") {
dtBegin = beginDate;
} else if (Object.prototype.toString.call(beginDate) == "[object String]") {
dtBegin = this.createCorrectDate(beginDate);
}
if (Object.prototype.toString.call(endDate) == "[object Date]") {
dtEnd = endDate;
} else if (Object.prototype.toString.call(endDate) == "[object String]") {
dtEnd = this.createCorrectDate(endDate);
}
if (isNaN(dtEnd)) return undefined;
switch (interval) {
case "s":
return parseInt((dtEnd - dtBegin) / 1000);
case "n":
return parseInt((dtEnd - dtBegin) / 60000);
case "h":
return parseInt((dtEnd - dtBegin) / 3600000);
case "d":
return parseInt((dtEnd - dtBegin) / 86400000);
case "w":
return parseInt((dtEnd - dtBegin) / (86400000 * 7));
case "m":
return (dtEnd.getMonth() + 1) + ((dtEnd.getFullYear() - dtBegin.getFullYear()) * 12) - (dtBegin.getMonth() + 1);
case "y":
return dtEnd.getFullYear() - dtBegin.getFullYear();
}
} catch (e) {
throw "无效的时间格式!";
}
},
/***************************************************
*比较两个日期的间隔
*参数说明:
*objDate:结束日期
*interval要返回的两个日期的间隔,比如:
*s:返回两个日期相差的秒数
*n:返回两个日期相差的分钟数
*h:返回两个日期相差的小时数
*d:返回两个日期相差的天数
*w:返回两个日期相差的周数
*m:返回连个日期相差的月数
*y:返回连个日期相差的年数
****************************************************/
dateDiff: function (interval, objBeginDate, objEndDate) {
var dtBegin = new Date(objBeginDate);
var dtEnd = new Date(objEndDate);
if (isNaN(dtEnd)) return undefined;
switch (interval) {
case "s":
return parseInt((dtEnd - dtBegin) / 1000);
case "n":
return parseInt((dtEnd - dtBegin) / 60000);
case "h":
return parseInt((dtEnd - dtBegin) / 3600000);
case "d":
return parseInt((dtEnd - dtBegin) / 86400000);
case "w":
return parseInt((dtEnd - dtBegin) / (86400000 * 7));
case "m":
return (dtEnd.getMonth() + 1) + ((dtEnd.getFullYear() - dtBegin.getFullYear()) * 12) - (dtBegin.getMonth() + 1);
case "y":
return dtEnd.getFullYear() - dtBegin.getFullYear();
}
},
clone: function () {
var options, name, src, copy, copyIsArray, clone,
target = arguments[0] || {},
i = 1,
length = arguments.length,
deep = false;
// Handle a deep copy situation
if (typeof target === "boolean") {
deep = target;
// Skip the boolean and the target
target = arguments[i] || {};
i++;
}
// Handle case when target is a string or something (possible in deep copy)
if (typeof target !== "object" && !this.isFunction(target)) {
target = {};
}
if (i === length) {
target = this;
i--;
}
for (; i < length; i++) {
// Only deal with non-null/undefined values
if ((options = arguments[i]) != null) {
// Extend the base object
for (name in options) {
src = target[name];
copy = options[name];
// Prevent never-ending loop
if (target === copy) {
continue;
}
// Recurse if we're merging plain objects or arrays
if (deep && copy && (this.isPlainObject(copy) ||
(copyIsArray = Array.isArray(copy)))) {
if (copyIsArray) {
copyIsArray = false;
clone = src && Array.isArray(src) ? src : [];
} else {
clone = src && this.isPlainObject(src) ? src : {};
}
// Never move original objects, clone them
target[name] = this.clone(deep, clone, copy);
// Don't bring in undefined values
} else if (copy !== undefined) {
target[name] = copy;
}
}
}
}
// Return the modified object
return target;
},
getQuery: function (queryKey, target, pattern) {
var locationSearch = location.search;
if (target) locationSearch = target;
var regExp = new RegExp("" + queryKey + "=([^&=]+)");
if (pattern) regExp = pattern;
var query;
if (regExp.test(locationSearch)) {
query = RegExp.$1;
}
return query;
},
getOffset: function (element) {
var left = 0, top = 0;
var parent = element;
while (parent != null) {
left += parent.offsetLeft;
top += parent.offsetTop;
parent = parent.offsetParent;
}
return { offsetX: left, offsetY: top };
},
getScrollOffsets: function (w) {
var w = w || window;
if (w.pageXOffset != null) {
return { scrollX: w.pageXOffset, scrollY: w.pageYOffset };
}
var doc = w.document;
if (doc.compatMode == "CSS1Compat") {
return { scrollX: doc.documentElement.scrollLeft, scrollY: doc.documentElement.scrollTop };
}
return { scrollX: doc.body.scrollLeft, scrollY: doc.body.scrollTop };
},
getViewPortSize: function (w) {
var w = w || window;
if (w.innerWidth) {
return { width: w.innerWidth, height: w.innerHeight };
}
var d = w.document;
if (d.compatMode == "CSS1Compat") {
return { width: d.documentElement.clientWidth, height: d.documentElement.clientHeight };
}
return { width: d.body.clientWidth, height: d.body.clientHeight };
}
};