|
|
|
@ -3,28 +3,29 @@
|
|
|
|
|
* Create By GUY 2014\11\17 |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
var traverse = function (func, context) { |
|
|
|
|
function traverse (func, context) { |
|
|
|
|
return function (value, key, obj) { |
|
|
|
|
return func.call(context, key, value, obj); |
|
|
|
|
}; |
|
|
|
|
}; |
|
|
|
|
var _apply = function (name) { |
|
|
|
|
} |
|
|
|
|
function _apply(name) { |
|
|
|
|
return function () { |
|
|
|
|
return BI._[name].apply(BI._, arguments); |
|
|
|
|
return BI._[name](...arguments); |
|
|
|
|
}; |
|
|
|
|
}; |
|
|
|
|
var _applyFunc = function (name) { |
|
|
|
|
} |
|
|
|
|
function _applyFunc(name) { |
|
|
|
|
return function () { |
|
|
|
|
var args = Array.prototype.slice.call(arguments, 0); |
|
|
|
|
const args = Array.prototype.slice.call(arguments, 0); |
|
|
|
|
args[1] = BI._.isFunction(args[1]) ? traverse(args[1], args[2]) : args[1]; |
|
|
|
|
return BI._[name].apply(BI._, args); |
|
|
|
|
|
|
|
|
|
return BI._[name](...args); |
|
|
|
|
}; |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function assert(v, is) { |
|
|
|
|
if (isFunction(is)) { |
|
|
|
|
if (!is(v)) { |
|
|
|
|
throw new Error(v + " error"); |
|
|
|
|
throw new Error(`${v} error`); |
|
|
|
|
} else { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
@ -33,8 +34,9 @@ export function assert(v, is) {
|
|
|
|
|
is = [is]; |
|
|
|
|
} |
|
|
|
|
if (!deepContains(is, v)) { |
|
|
|
|
throw new Error(v + " error"); |
|
|
|
|
throw new Error(`${v} error`); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -43,12 +45,13 @@ export function warn(message) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function UUID() { |
|
|
|
|
var f = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]; |
|
|
|
|
var str = ""; |
|
|
|
|
for (var i = 0; i < 16; i++) { |
|
|
|
|
var r = _global.parseInt(f.length * Math.random(), 10); |
|
|
|
|
const f = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]; |
|
|
|
|
let str = ""; |
|
|
|
|
for (let i = 0; i < 16; i++) { |
|
|
|
|
const r = _global.parseInt(f.length * Math.random(), 10); |
|
|
|
|
str += f[r]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return str; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -66,58 +69,60 @@ export function createWidgets(items, options, context) {
|
|
|
|
|
} else { |
|
|
|
|
options || (options = {}); |
|
|
|
|
} |
|
|
|
|
return map(flatten(items), function (i, item) { |
|
|
|
|
return BI.createWidget(item, deepClone(options), context); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return map(flatten(items), (i, item) => BI.createWidget(item, deepClone(options), context)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function createItems(data, innerAttr, outerAttr) { |
|
|
|
|
innerAttr = isArray(innerAttr) ? innerAttr : makeArray(flatten(data).length, innerAttr || {}); |
|
|
|
|
outerAttr = isArray(outerAttr) ? outerAttr : makeArray(flatten(data).length, outerAttr || {}); |
|
|
|
|
return map(data, function (i, item) { |
|
|
|
|
|
|
|
|
|
return map(data, (i, item) => { |
|
|
|
|
if (isArray(item)) { |
|
|
|
|
return createItems(item, innerAttr, outerAttr); |
|
|
|
|
} |
|
|
|
|
if (item instanceof BI.Widget) { |
|
|
|
|
return extend({}, innerAttr.shift(), outerAttr.shift(), { |
|
|
|
|
type: null, |
|
|
|
|
el: item |
|
|
|
|
el: item, |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
if (innerAttr[0] instanceof BI.Widget) { |
|
|
|
|
outerAttr.shift(); |
|
|
|
|
|
|
|
|
|
return extend({}, item, { |
|
|
|
|
el: innerAttr.shift() |
|
|
|
|
el: innerAttr.shift(), |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
if (item.el instanceof BI.Widget) { |
|
|
|
|
innerAttr.shift(); |
|
|
|
|
|
|
|
|
|
return extend({}, outerAttr.shift(), { type: null }, item); |
|
|
|
|
} |
|
|
|
|
if (item.el) { |
|
|
|
|
return extend({}, outerAttr.shift(), item, { |
|
|
|
|
el: extend({}, innerAttr.shift(), item.el) |
|
|
|
|
el: extend({}, innerAttr.shift(), item.el), |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return extend({}, outerAttr.shift(), { |
|
|
|
|
el: extend({}, innerAttr.shift(), item) |
|
|
|
|
el: extend({}, innerAttr.shift(), item), |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 用容器包装items
|
|
|
|
|
export function packageItems(items, layouts) { |
|
|
|
|
for (var i = layouts.length - 1; i >= 0; i--) { |
|
|
|
|
items = map(items, function (k, it) { |
|
|
|
|
return extend({}, layouts[i], { |
|
|
|
|
for (let i = layouts.length - 1; i >= 0; i--) { |
|
|
|
|
items = map(items, (k, it) => extend({}, layouts[i], { |
|
|
|
|
items: [ |
|
|
|
|
extend({}, layouts[i].el, { |
|
|
|
|
el: it |
|
|
|
|
el: it, |
|
|
|
|
}) |
|
|
|
|
] |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
], |
|
|
|
|
})); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return items; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -125,8 +130,9 @@ export function formatEL(obj) {
|
|
|
|
|
if (obj && !obj.type && obj.el) { |
|
|
|
|
return obj; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
el: obj |
|
|
|
|
el: obj, |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -140,13 +146,13 @@ export function trans2Element(widgets) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 集合相关方法
|
|
|
|
|
BI._.each(["where", "findWhere", "invoke", "pluck", "shuffle", "sample", "toArray", "size"], function (name) { |
|
|
|
|
BI._.each(["where", "findWhere", "invoke", "pluck", "shuffle", "sample", "toArray", "size"], name => { |
|
|
|
|
BI[name] = _apply(name); |
|
|
|
|
}); |
|
|
|
|
BI._.each([ |
|
|
|
|
"get", "set", "each", "map", "reduce", "reduceRight", "find", "filter", "reject", "every", "all", "some", "any", "max", "min", |
|
|
|
|
"sortBy", "groupBy", "indexBy", "countBy", "partition", "clamp" |
|
|
|
|
], function (name) { |
|
|
|
|
], name => { |
|
|
|
|
if (name === "any") { |
|
|
|
|
BI[name] = _applyFunc("some"); |
|
|
|
|
} else { |
|
|
|
@ -185,12 +191,13 @@ export const clamp = BI.clamp;
|
|
|
|
|
|
|
|
|
|
// 数数
|
|
|
|
|
export function count(from, to, predicate) { |
|
|
|
|
var t; |
|
|
|
|
let t; |
|
|
|
|
if (predicate) { |
|
|
|
|
for (t = from; t < to; t++) { |
|
|
|
|
predicate(t); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return to - from; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -201,45 +208,51 @@ export function inverse(from, to, predicate) {
|
|
|
|
|
|
|
|
|
|
export function firstKey(obj) { |
|
|
|
|
let res = undefined; |
|
|
|
|
any(obj, function (key, value) { |
|
|
|
|
any(obj, (key, value) => { |
|
|
|
|
res = key; |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function lastKey(obj) { |
|
|
|
|
let res = undefined; |
|
|
|
|
each(obj, function (key, value) { |
|
|
|
|
each(obj, (key, value) => { |
|
|
|
|
res = key; |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function firstObject(obj) { |
|
|
|
|
let res = undefined; |
|
|
|
|
any(obj, function (key, value) { |
|
|
|
|
any(obj, (key, value) => { |
|
|
|
|
res = value; |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function lastObject(obj) { |
|
|
|
|
let res = undefined; |
|
|
|
|
each(obj, function (key, value) { |
|
|
|
|
each(obj, (key, value) => { |
|
|
|
|
res = value; |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function concat(obj1, obj2) { |
|
|
|
|
if (isKey(obj1)) { |
|
|
|
|
return map([].slice.apply(arguments), function (idx, v) { |
|
|
|
|
return v; |
|
|
|
|
}).join(""); |
|
|
|
|
return map([].slice.apply(arguments), (idx, v) => v).join(""); |
|
|
|
|
} |
|
|
|
|
if (isArray(obj1)) { |
|
|
|
|
return BI._.concat.apply([], arguments); |
|
|
|
@ -254,6 +267,7 @@ export function backEach(obj, predicate, context) {
|
|
|
|
|
for (let index = obj.length - 1; index >= 0; index--) { |
|
|
|
|
predicate(index, obj[index], obj); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -264,6 +278,7 @@ export function backAny(obj, predicate, context) {
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -274,12 +289,14 @@ export function backEvery(obj, predicate, context) {
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function backFindKey(obj, predicate, context) { |
|
|
|
|
predicate = iteratee(predicate, context); |
|
|
|
|
let objKeys = keys(obj), key; |
|
|
|
|
const objKeys = keys(obj); |
|
|
|
|
let key; |
|
|
|
|
for (let i = objKeys.length - 1; i >= 0; i--) { |
|
|
|
|
key = objKeys[i]; |
|
|
|
|
if (predicate(obj[key], key, obj)) { |
|
|
|
@ -311,7 +328,7 @@ export function remove(obj, target, context) {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
each(obj, function (i, v) { |
|
|
|
|
each(obj, (i, v) => { |
|
|
|
|
if ((targetIsFunction && (target === obj[i] || target.apply(context, [i, obj[i]]) === true)) || (!targetIsFunction && contains(target, obj[i]))) { |
|
|
|
|
delete obj[i]; |
|
|
|
|
} |
|
|
|
@ -321,7 +338,8 @@ export function remove(obj, target, context) {
|
|
|
|
|
|
|
|
|
|
export function removeAt(obj, index) { |
|
|
|
|
index = isArray(index) ? index : [index]; |
|
|
|
|
let objIsArray = isArray(obj), i; |
|
|
|
|
const objIsArray = isArray(obj); |
|
|
|
|
let i; |
|
|
|
|
for (i = 0; i < index.length; i++) { |
|
|
|
|
if (objIsArray) { |
|
|
|
|
obj[index[i]] = "$deleteIndex"; |
|
|
|
@ -343,13 +361,15 @@ export function array2String(array) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function abc2Int(string) { |
|
|
|
|
let idx = 0, start = "A", str = string.toUpperCase(); |
|
|
|
|
let idx = 0; |
|
|
|
|
const start = "A", str = string.toUpperCase(); |
|
|
|
|
for (let i = 0, len = str.length; i < len; ++i) { |
|
|
|
|
idx = str.charAt(i).charCodeAt(0) - start.charCodeAt(0) + 26 * idx + 1; |
|
|
|
|
if (idx > (2147483646 - str.charAt(i).charCodeAt(0) + start.charCodeAt(0)) / 26) { |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return idx; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -367,6 +387,7 @@ export function int2Abc(num) {
|
|
|
|
|
str = DIGITS[t - 1] + str; |
|
|
|
|
idx = (idx - t) / 26; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return str; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -374,10 +395,10 @@ export function int2Abc(num) {
|
|
|
|
|
BI._.each([ |
|
|
|
|
"first", "initial", "last", "rest", "compact", "flatten", "without", "union", "intersection", |
|
|
|
|
"difference", "zip", "unzip", "object", "indexOf", "lastIndexOf", "sortedIndex", "range", "take", "takeRight", "uniqBy" |
|
|
|
|
], function (name) { |
|
|
|
|
], name => { |
|
|
|
|
BI[name] = _apply(name); |
|
|
|
|
}); |
|
|
|
|
BI._.each(["findIndex", "findLastIndex"], function (name) { |
|
|
|
|
BI._.each(["findIndex", "findLastIndex"], name => { |
|
|
|
|
BI[name] = _applyFunc(name); |
|
|
|
|
}); |
|
|
|
|
export const first = BI.first; |
|
|
|
@ -405,7 +426,7 @@ export const findLastIndex = BI.findLastIndex;
|
|
|
|
|
|
|
|
|
|
// 构建一个长度为length的数组
|
|
|
|
|
export function makeArray(length, value) { |
|
|
|
|
let res = []; |
|
|
|
|
const res = []; |
|
|
|
|
for (let i = 0; i < length; i++) { |
|
|
|
|
if (isNull(value)) { |
|
|
|
|
res.push(i); |
|
|
|
@ -413,11 +434,12 @@ export function makeArray(length, value) {
|
|
|
|
|
res.push(deepClone(value)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function makeObject(array, value) { |
|
|
|
|
let map = {}; |
|
|
|
|
const map = {}; |
|
|
|
|
for (let i = 0; i < array.length; i++) { |
|
|
|
|
if (isNull(value)) { |
|
|
|
|
map[array[i]] = array[i]; |
|
|
|
@ -427,11 +449,12 @@ export function makeObject(array, value) {
|
|
|
|
|
map[array[i]] = deepClone(value); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return map; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function makeArrayByArray(array, value) { |
|
|
|
|
let res = []; |
|
|
|
|
const res = []; |
|
|
|
|
if (!array) { |
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
@ -442,11 +465,12 @@ export function makeArrayByArray(array, value) {
|
|
|
|
|
res.push(deepClone(value)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function uniq(array, isSorted, iteratee, context) { |
|
|
|
|
if (array == null) { |
|
|
|
|
if (array === null) { |
|
|
|
|
return []; |
|
|
|
|
} |
|
|
|
|
if (!isBoolean(isSorted)) { |
|
|
|
@ -455,7 +479,8 @@ export function uniq(array, isSorted, iteratee, context) {
|
|
|
|
|
isSorted = false; |
|
|
|
|
} |
|
|
|
|
iteratee && (iteratee = traverse(iteratee, context)); |
|
|
|
|
return uniq.call(BI._, array, isSorted, iteratee, context); |
|
|
|
|
|
|
|
|
|
return BI._uniq.call(BI._, array, isSorted, iteratee, context); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 对象相关方法
|
|
|
|
@ -464,7 +489,7 @@ BI._.each([
|
|
|
|
|
"defaults", "clone", "property", "propertyOf", "matcher", "isEqual", "isMatch", "isEmpty", |
|
|
|
|
"isElement", "isNumber", "isString", "isArray", "isObject", "isPlainObject", "isArguments", "isFunction", "isFinite", |
|
|
|
|
"isBoolean", "isDate", "isRegExp", "isError", "isNaN", "isUndefined", "zipObject", "cloneDeep" |
|
|
|
|
], function (name) { |
|
|
|
|
], name => { |
|
|
|
|
BI[name] = _apply(name); |
|
|
|
|
}); |
|
|
|
|
export const keys = BI.keys; |
|
|
|
@ -502,7 +527,7 @@ export const isUndefined = BI.isUndefined;
|
|
|
|
|
export const zipObject = BI.zipObject; |
|
|
|
|
export const cloneDeep = BI.cloneDeep; |
|
|
|
|
|
|
|
|
|
BI._.each(["mapObject", "findKey", "pick", "omit", "tap"], function (name) { |
|
|
|
|
BI._.each(["mapObject", "findKey", "pick", "omit", "tap"], name => { |
|
|
|
|
BI[name] = _applyFunc(name); |
|
|
|
|
}); |
|
|
|
|
export const mapObject = BI.mapObject; |
|
|
|
@ -512,17 +537,18 @@ export const omit = BI.omit;
|
|
|
|
|
export const tap = BI.tap; |
|
|
|
|
|
|
|
|
|
export function inherit(sp, overrides) { |
|
|
|
|
let sb = function () { |
|
|
|
|
function sb () { |
|
|
|
|
return sp.apply(this, arguments); |
|
|
|
|
}; |
|
|
|
|
let F = function () { |
|
|
|
|
}, spp = sp.prototype; |
|
|
|
|
} |
|
|
|
|
function F () {} |
|
|
|
|
const spp = sp.prototype; |
|
|
|
|
F.prototype = spp; |
|
|
|
|
sb.prototype = new F(); |
|
|
|
|
sb.superclass = spp; |
|
|
|
|
extend(sb.prototype, overrides, { |
|
|
|
|
superclass: sp |
|
|
|
|
superclass: sp, |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return sb; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -542,11 +568,11 @@ export function has(obj, keys) {
|
|
|
|
|
if (keys.length === 0) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
return every(keys, function (i, key) { |
|
|
|
|
return BI._.has(obj, key); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return every(keys, (i, key) => BI._.has(obj, key)); |
|
|
|
|
} |
|
|
|
|
return BI._.has.apply(BI._, arguments); |
|
|
|
|
|
|
|
|
|
return BI._.has(...arguments); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function freeze(value) { |
|
|
|
@ -555,6 +581,7 @@ export function freeze(value) {
|
|
|
|
|
if (Object.freeze && isObject(value)) { |
|
|
|
|
return Object.freeze(value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return value; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -565,8 +592,9 @@ export function isKey(key) {
|
|
|
|
|
|
|
|
|
|
// 忽略大小写的等于
|
|
|
|
|
export function isCapitalEqual(a, b) { |
|
|
|
|
a = isNull(a) ? a : ("" + a).toLowerCase(); |
|
|
|
|
b = isNull(b) ? b : ("" + b).toLowerCase(); |
|
|
|
|
a = isNull(a) ? a : (`${a}`).toLowerCase(); |
|
|
|
|
b = isNull(b) ? b : (`${b}`).toLowerCase(); |
|
|
|
|
|
|
|
|
|
return isEqual(a, b); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -603,7 +631,7 @@ export function isNotEmptyObject(obj) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function isWindow(obj) { |
|
|
|
|
return obj != null && obj == obj.window; |
|
|
|
|
return obj !== null && obj === obj.window; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function isPromise(obj) { |
|
|
|
@ -614,8 +642,8 @@ export const deepClone = BI._.cloneDeep;
|
|
|
|
|
export const deepExtend = BI._.deepExtend; |
|
|
|
|
|
|
|
|
|
export function isDeepMatch(object, attrs) { |
|
|
|
|
let attrsKeys = keys(attrs), length = attrsKeys.length; |
|
|
|
|
if (object == null) { |
|
|
|
|
const attrsKeys = keys(attrs), length = attrsKeys.length; |
|
|
|
|
if (object === null) { |
|
|
|
|
return !length; |
|
|
|
|
} |
|
|
|
|
const obj = Object(object); |
|
|
|
@ -625,11 +653,13 @@ export function isDeepMatch(object, attrs) {
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function contains(obj, target, fromIndex) { |
|
|
|
|
if (!BI._.isArrayLike(obj)) obj = values(obj); |
|
|
|
|
|
|
|
|
|
return indexOf(obj, target, typeof fromIndex === "number" && fromIndex) >= 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -637,6 +667,7 @@ export function deepContains(obj, copy) {
|
|
|
|
|
if (isObject(copy)) { |
|
|
|
|
return any(obj, (i, v) => isEqual(v, copy)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return contains(obj, copy); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -646,6 +677,7 @@ export function deepIndexOf(obj, target) {
|
|
|
|
|
return i; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -667,35 +699,39 @@ export function deepRemove(obj, target) {
|
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return done; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function deepWithout(obj, target) { |
|
|
|
|
if (isArray(obj)) { |
|
|
|
|
let result = []; |
|
|
|
|
const result = []; |
|
|
|
|
for (let i = 0; i < obj.length; i++) { |
|
|
|
|
if (!isEqual(target, obj[i])) { |
|
|
|
|
result.push(obj[i]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
let result = {}; |
|
|
|
|
const result = {}; |
|
|
|
|
each(obj, (i, v) => { |
|
|
|
|
if (!isEqual(target, obj[i])) { |
|
|
|
|
result[i] = v; |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function deepUnique(array) { |
|
|
|
|
let result = []; |
|
|
|
|
const result = []; |
|
|
|
|
each(array, (i, item) => { |
|
|
|
|
if (!deepContains(result, item)) { |
|
|
|
|
result.push(item); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -703,9 +739,9 @@ export function deepUnique(array) {
|
|
|
|
|
export function deepDiff(object, other) { |
|
|
|
|
object || (object = {}); |
|
|
|
|
other || (other = {}); |
|
|
|
|
let result = []; |
|
|
|
|
let used = []; |
|
|
|
|
for (let b in object) { |
|
|
|
|
const result = []; |
|
|
|
|
const used = []; |
|
|
|
|
for (const b in object) { |
|
|
|
|
if (has(object, b)) { |
|
|
|
|
if (!isEqual(object[b], other[b])) { |
|
|
|
|
result.push(b); |
|
|
|
@ -713,19 +749,18 @@ export function deepDiff(object, other) {
|
|
|
|
|
used.push(b); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for (let b in other) { |
|
|
|
|
for (const b in other) { |
|
|
|
|
if (has(other, b) && !contains(used, b)) { |
|
|
|
|
result.push(b); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 通用方法
|
|
|
|
|
BI._.each(["uniqueId", "result", "chain", "iteratee", "unescape", "before", "after", "chunk"], function (name) { |
|
|
|
|
BI[name] = function () { |
|
|
|
|
return BI._[name].apply(BI._, arguments); |
|
|
|
|
}; |
|
|
|
|
BI._.each(["uniqueId", "result", "chain", "iteratee", "unescape", "before", "after", "chunk"], name => { |
|
|
|
|
BI[name] = (...args) => BI._[name](...args); |
|
|
|
|
}); |
|
|
|
|
export const uniqueId = BI.uniqueId; |
|
|
|
|
export const result = BI.result; |
|
|
|
@ -737,10 +772,8 @@ export const after = BI.after;
|
|
|
|
|
export const chunk = BI.chunk; |
|
|
|
|
|
|
|
|
|
// 事件相关方法
|
|
|
|
|
BI._.each(["bind", "once", "partial", "debounce", "throttle", "delay", "defer", "wrap"], function (name) { |
|
|
|
|
BI[name] = function () { |
|
|
|
|
return BI._[name].apply(BI._, arguments); |
|
|
|
|
}; |
|
|
|
|
BI._.each(["bind", "once", "partial", "debounce", "throttle", "delay", "defer", "wrap"], name => { |
|
|
|
|
BI[name] = (...args) => BI._[name](...args); |
|
|
|
|
}); |
|
|
|
|
export const bind = BI.bind; |
|
|
|
|
export const once = BI.once; |
|
|
|
@ -752,13 +785,13 @@ export const defer = BI.defer;
|
|
|
|
|
export const wrap = BI.wrap; |
|
|
|
|
|
|
|
|
|
export const nextTick = (function () { |
|
|
|
|
let callbacks = []; |
|
|
|
|
const callbacks = []; |
|
|
|
|
let pending = false; |
|
|
|
|
let timerFunc = void 0; |
|
|
|
|
|
|
|
|
|
function nextTickHandler() { |
|
|
|
|
pending = false; |
|
|
|
|
let copies = callbacks.slice(0); |
|
|
|
|
const copies = callbacks.slice(0); |
|
|
|
|
callbacks.length = 0; |
|
|
|
|
for (let i = 0; i < copies.length; i++) { |
|
|
|
|
copies[i](); |
|
|
|
@ -766,16 +799,16 @@ export const nextTick = (function () {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (typeof Promise !== "undefined") { |
|
|
|
|
let p = Promise.resolve(); |
|
|
|
|
const p = Promise.resolve(); |
|
|
|
|
timerFunc = function timerFunc() { |
|
|
|
|
p.then(nextTickHandler); |
|
|
|
|
}; |
|
|
|
|
} else if (typeof MutationObserver !== "undefined") { |
|
|
|
|
let counter = 1; |
|
|
|
|
let observer = new MutationObserver(nextTickHandler); |
|
|
|
|
let textNode = document.createTextNode(String(counter)); |
|
|
|
|
const observer = new MutationObserver(nextTickHandler); |
|
|
|
|
const textNode = document.createTextNode(String(counter)); |
|
|
|
|
observer.observe(textNode, { |
|
|
|
|
characterData: true |
|
|
|
|
characterData: true, |
|
|
|
|
}); |
|
|
|
|
timerFunc = function timerFunc() { |
|
|
|
|
counter = (counter + 1) % 2; |
|
|
|
@ -794,16 +827,16 @@ export const nextTick = (function () {
|
|
|
|
|
|
|
|
|
|
return function queueNextTick(cb) { |
|
|
|
|
let _resolve = void 0; |
|
|
|
|
let args = [].slice.call(arguments, 1); |
|
|
|
|
callbacks.push(function () { |
|
|
|
|
const args = [].slice.call(arguments, 1); |
|
|
|
|
callbacks.push(() => { |
|
|
|
|
if (cb) { |
|
|
|
|
try { |
|
|
|
|
cb.apply(null, args); |
|
|
|
|
cb(...args); |
|
|
|
|
} catch (e) { |
|
|
|
|
console.error(e); |
|
|
|
|
} |
|
|
|
|
} else if (_resolve) { |
|
|
|
|
_resolve.apply(null, args); |
|
|
|
|
_resolve(...args); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
if (!pending) { |
|
|
|
@ -811,16 +844,16 @@ export const nextTick = (function () {
|
|
|
|
|
timerFunc(); |
|
|
|
|
} |
|
|
|
|
// $flow-disable-line
|
|
|
|
|
if (!cb && typeof Promise !== 'undefined') { |
|
|
|
|
return new Promise(function (resolve, reject) { |
|
|
|
|
if (!cb && typeof Promise !== "undefined") { |
|
|
|
|
return new Promise(((resolve, reject) => { |
|
|
|
|
_resolve = resolve; |
|
|
|
|
}); |
|
|
|
|
})); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
})(); |
|
|
|
|
}()); |
|
|
|
|
|
|
|
|
|
// 数字相关方法
|
|
|
|
|
BI._.each(["random"], function (name) { |
|
|
|
|
BI._.each(["random"], name => { |
|
|
|
|
BI[name] = _apply(name); |
|
|
|
|
}); |
|
|
|
|
export const random = BI.random; |
|
|
|
@ -833,13 +866,13 @@ export function parseInt(number) {
|
|
|
|
|
try { |
|
|
|
|
return _global.parseInt(number, radix); |
|
|
|
|
} catch (e) { |
|
|
|
|
throw new Error(number + "parse int error"); |
|
|
|
|
return NaN; |
|
|
|
|
throw new Error(`${number}parse int error`); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function parseSafeInt(value) { |
|
|
|
|
let MAX_SAFE_INTEGER = 9007199254740991; |
|
|
|
|
const MAX_SAFE_INTEGER = 9007199254740991; |
|
|
|
|
|
|
|
|
|
return value |
|
|
|
|
? clamp(parseInt(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) |
|
|
|
|
: (value === 0 ? value : 0); |
|
|
|
@ -849,8 +882,7 @@ export function parseFloat(number) {
|
|
|
|
|
try { |
|
|
|
|
return _global.parseFloat(number); |
|
|
|
|
} catch (e) { |
|
|
|
|
throw new Error(number + "parse float error"); |
|
|
|
|
return NaN; |
|
|
|
|
throw new Error(`${number}parse float error`); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -863,11 +895,11 @@ export function isPositiveInteger(number) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function isNegativeInteger(number) { |
|
|
|
|
return /^\-[1-9][0-9]*$/.test(number); |
|
|
|
|
return /^-[1-9][0-9]*$/.test(number); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function isInteger(number) { |
|
|
|
|
return /^\-?\d+$/.test(number); |
|
|
|
|
return /^-?\d+$/.test(number); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function isNumeric(number) { |
|
|
|
@ -882,6 +914,7 @@ export function isOdd(number) {
|
|
|
|
|
if (!isInteger(number)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return (number & 1) === 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -889,6 +922,7 @@ export function isEven(number) {
|
|
|
|
|
if (!isInteger(number)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return (number & 1) === 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -901,24 +935,26 @@ export function sum(array, iteratee, context) {
|
|
|
|
|
sum += Number(item); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return sum; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function average(array, iteratee, context) { |
|
|
|
|
const sumResult = sum(array, iteratee, context); |
|
|
|
|
|
|
|
|
|
return sumResult / array.length; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function trim() { |
|
|
|
|
return BI._.trim.apply(BI._, arguments); |
|
|
|
|
export function trim(...args) { |
|
|
|
|
return BI._.trim(...args); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function toUpperCase(string) { |
|
|
|
|
return (string + "").toLocaleUpperCase(); |
|
|
|
|
return (`${string}`).toLocaleUpperCase(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function toLowerCase(string) { |
|
|
|
|
return (string + "").toLocaleLowerCase(); |
|
|
|
|
return (`${string}`).toLocaleLowerCase(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function isEndWithBlank(string) { |
|
|
|
@ -926,12 +962,13 @@ export function isEndWithBlank(string) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function isLiteral(exp) { |
|
|
|
|
return /^\s?(true|false|-?[\d\.]+|'[^']*'|"[^"]*")\s?$/.test(exp); |
|
|
|
|
return /^\s?(true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/.test(exp); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function stripQuotes(str) { |
|
|
|
|
const a = str.charCodeAt(0); |
|
|
|
|
const b = str.charCodeAt(str.length - 1); |
|
|
|
|
|
|
|
|
|
return a === b && (a === 0x22 || a === 0x27) |
|
|
|
|
? str.slice(1, -1) |
|
|
|
|
: str; |
|
|
|
@ -1015,6 +1052,7 @@ export function leftPad(val, size, ch) {
|
|
|
|
|
while (result.length < size) { |
|
|
|
|
result = ch + result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return result.toString(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1030,7 +1068,8 @@ export function leftPad(val, size, ch) {
|
|
|
|
|
* @return {String} 做了替换后的字符串 |
|
|
|
|
*/ |
|
|
|
|
export function format(format) { |
|
|
|
|
var args = Array.prototype.slice.call(arguments, 1); |
|
|
|
|
const args = Array.prototype.slice.call(arguments, 1); |
|
|
|
|
|
|
|
|
|
return format.replace(/\{(\d+)\}/g, (m, i) => args[i]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1065,25 +1104,26 @@ export function checkDateVoid(YY, MM, DD, minDate, maxDate) {
|
|
|
|
|
} else if (YY > maxDate[0]) { |
|
|
|
|
back = ["y", 1]; |
|
|
|
|
} else if (YY >= minDate[0] && YY <= maxDate[0]) { |
|
|
|
|
if (YY == minDate[0]) { |
|
|
|
|
if (YY === minDate[0]) { |
|
|
|
|
if (MM < minDate[1]) { |
|
|
|
|
back = ["m"]; |
|
|
|
|
} else if (MM == minDate[1]) { |
|
|
|
|
} else if (MM === minDate[1]) { |
|
|
|
|
if (DD < minDate[2]) { |
|
|
|
|
back = ["d"]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (YY == maxDate[0]) { |
|
|
|
|
if (YY === maxDate[0]) { |
|
|
|
|
if (MM > maxDate[1]) { |
|
|
|
|
back = ["m", 1]; |
|
|
|
|
} else if (MM == maxDate[1]) { |
|
|
|
|
} else if (MM === maxDate[1]) { |
|
|
|
|
if (DD > maxDate[2]) { |
|
|
|
|
back = ["d", 1]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return back; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1096,8 +1136,9 @@ export function checkDateLegal(str) {
|
|
|
|
|
if (ar.length <= 2) { |
|
|
|
|
return MM >= 1 && MM <= 12; |
|
|
|
|
} |
|
|
|
|
let MD = BI.Date._MD.slice(0); |
|
|
|
|
const MD = BI.Date._MD.slice(0); |
|
|
|
|
MD[1] = isLeapYear(YY) ? 29 : 28; |
|
|
|
|
|
|
|
|
|
return MM >= 1 && MM <= 12 && DD <= MD[MM - 1]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1114,15 +1155,15 @@ export function parseDateTime(str, fmt) {
|
|
|
|
|
let m; |
|
|
|
|
let d; |
|
|
|
|
// wei : 对于fmt为‘YYYYMM’或者‘YYYYMMdd’的格式,str的值为类似'201111'的形式,因为年月之间没有分隔符,所以正则表达式分割无效,导致bug7376。
|
|
|
|
|
let a = str.split(/\W+/); |
|
|
|
|
if (fmt.toLowerCase() == "%y%x" || fmt.toLowerCase() == "%y%x%d") { |
|
|
|
|
let yearlength = 4; |
|
|
|
|
let otherlength = 2; |
|
|
|
|
const a = str.split(/\W+/); |
|
|
|
|
if (fmt.toLowerCase() === "%y%x" || fmt.toLowerCase() === "%y%x%d") { |
|
|
|
|
const yearlength = 4; |
|
|
|
|
const otherlength = 2; |
|
|
|
|
a[0] = str.substring(0, yearlength); |
|
|
|
|
a[1] = str.substring(yearlength, yearlength + otherlength); |
|
|
|
|
a[2] = str.substring(yearlength + otherlength, yearlength + otherlength * 2); |
|
|
|
|
} |
|
|
|
|
let b = fmt.match(/%./g); |
|
|
|
|
const b = fmt.match(/%./g); |
|
|
|
|
let i = 0, j = 0; |
|
|
|
|
let hr = 0; |
|
|
|
|
let min = 0; |
|
|
|
@ -1150,7 +1191,7 @@ export function parseDateTime(str, fmt) {
|
|
|
|
|
case "%b": |
|
|
|
|
case "%B": |
|
|
|
|
for (j = 0; j < 12; ++j) { |
|
|
|
|
if (BI.getMonthName(j).substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { |
|
|
|
|
if (BI.getMonthName(j).substr(0, a[i].length).toLowerCase() === a[i].toLowerCase()) { |
|
|
|
|
m = j; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
@ -1182,6 +1223,7 @@ export function parseDateTime(str, fmt) {
|
|
|
|
|
case "%S": |
|
|
|
|
sec = _global.parseInt(a[i], 10); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// if (!a[i]) {
|
|
|
|
@ -1205,45 +1247,46 @@ export function parseDateTime(str, fmt) {
|
|
|
|
|
if (isNaN(sec)) { |
|
|
|
|
sec = today.getSeconds(); |
|
|
|
|
} |
|
|
|
|
if (y != 0) { |
|
|
|
|
if (y !== 0) { |
|
|
|
|
return BI.getDate(y, m, d, hr, min, sec); |
|
|
|
|
} |
|
|
|
|
y = 0; |
|
|
|
|
m = -1; |
|
|
|
|
d = 0; |
|
|
|
|
for (i = 0; i < a.length; ++i) { |
|
|
|
|
if (a[i].search(/[a-zA-Z]+/) != -1) { |
|
|
|
|
if (a[i].search(/[a-zA-Z]+/) !== -1) { |
|
|
|
|
let t = -1; |
|
|
|
|
for (j = 0; j < 12; ++j) { |
|
|
|
|
if (BI.getMonthName(j).substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { |
|
|
|
|
if (BI.getMonthName(j).substr(0, a[i].length).toLowerCase() === a[i].toLowerCase()) { |
|
|
|
|
t = j; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (t != -1) { |
|
|
|
|
if (m != -1) { |
|
|
|
|
if (t !== -1) { |
|
|
|
|
if (m !== -1) { |
|
|
|
|
d = m + 1; |
|
|
|
|
} |
|
|
|
|
m = t; |
|
|
|
|
} |
|
|
|
|
} else if (_global.parseInt(a[i], 10) <= 12 && m == -1) { |
|
|
|
|
} else if (_global.parseInt(a[i], 10) <= 12 && m === -1) { |
|
|
|
|
m = a[i] - 1; |
|
|
|
|
} else if (_global.parseInt(a[i], 10) > 31 && y == 0) { |
|
|
|
|
} else if (_global.parseInt(a[i], 10) > 31 && y === 0) { |
|
|
|
|
y = _global.parseInt(a[i], 10); |
|
|
|
|
(y < 100) && (y += (y > 29) ? 1900 : 2000); |
|
|
|
|
} else if (d == 0) { |
|
|
|
|
} else if (d === 0) { |
|
|
|
|
d = a[i]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (y == 0) { |
|
|
|
|
if (y === 0) { |
|
|
|
|
y = today.getFullYear(); |
|
|
|
|
} |
|
|
|
|
if (m === -1) { |
|
|
|
|
m = today.getMonth(); |
|
|
|
|
} |
|
|
|
|
if (m != -1 && d != 0) { |
|
|
|
|
if (m !== -1 && d !== 0) { |
|
|
|
|
return BI.getDate(y, m, d, hr, min, sec); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return today; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1292,8 +1335,10 @@ export function getDate(...args) {
|
|
|
|
|
// BI-33791 1901年以前的东8区标准是GMT+0805, 统一无论是什么时间,都以整的0800这样的为基准
|
|
|
|
|
const localOffset = dt.getTimezoneOffset() * 60000; // 获得当地时间偏移的毫秒数
|
|
|
|
|
const utc = localTime + localOffset; // utc即GMT时间标准时区
|
|
|
|
|
|
|
|
|
|
return new Date(utc + BI.timeZone);// + Pool.timeZone.offset);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return dt; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1342,6 +1387,7 @@ export function getTime() {
|
|
|
|
|
// BI-33791 1901年以前的东8区标准是GMT+0805, 统一无论是什么时间,都以整的0800这样的为基准
|
|
|
|
|
return dt.getTime() - BI.timeZone - new Date().getTimezoneOffset() * 60000; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return dt.getTime(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|