@panpanzhao/component-ui 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/component-ui.common.js +5689 -0
- package/lib/components/crud.js +2276 -0
- package/lib/components/form-dialog.js +1198 -0
- package/lib/components/form-group.js +883 -0
- package/lib/components/form-input.js +1571 -0
- package/lib/components/form-item.js +284 -0
- package/lib/components/form-view-dialog.js +963 -0
- package/lib/components/form-view-group.js +687 -0
- package/lib/components/form-view.js +409 -0
- package/lib/components/form.js +495 -0
- package/lib/components/table-column.js +1053 -0
- package/lib/components/table-editable.js +954 -0
- package/lib/components/table-search.js +407 -0
- package/lib/components/table.js +659 -0
- package/lib/index.js +1 -0
- package/lib/styles/component-ui.css +1 -0
- package/lib/styles/fonts/element-icons.ttf +0 -0
- package/lib/styles/fonts/element-icons.woff +0 -0
- package/lib/styles/form.css +1 -0
- package/lib/styles/index.css +1 -0
- package/lib/styles/table-editable.css +1 -0
- package/lib/styles/table.css +1 -0
- package/lib/utils/formula/evalutor.js +1883 -0
- package/lib/utils/formula/filter.js +48 -0
- package/lib/utils/formula/function.js +12 -0
- package/lib/utils/formula/index.js +25 -0
- package/lib/utils/formula/lexer.js +590 -0
- package/lib/utils/formula/parser.js +734 -0
- package/package.json +67 -0
|
@@ -0,0 +1,1883 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.Evaluator = void 0;
|
|
5
|
+
exports.createObject = createObject;
|
|
6
|
+
var _moment = _interopRequireDefault(require("moment"));
|
|
7
|
+
var _upperFirst = _interopRequireDefault(require("lodash/upperFirst"));
|
|
8
|
+
var _padStart = _interopRequireDefault(require("lodash/padStart"));
|
|
9
|
+
var _capitalize = _interopRequireDefault(require("lodash/capitalize"));
|
|
10
|
+
var _escape = _interopRequireDefault(require("lodash/escape"));
|
|
11
|
+
var _truncate = _interopRequireDefault(require("lodash/truncate"));
|
|
12
|
+
var _uniqWith = _interopRequireDefault(require("lodash/uniqWith"));
|
|
13
|
+
var _uniqBy = _interopRequireDefault(require("lodash/uniqBy"));
|
|
14
|
+
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
|
|
15
|
+
var _isPlainObject = _interopRequireDefault(require("lodash/isPlainObject"));
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
+
function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
18
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
19
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
20
|
+
var Evaluator = /*#__PURE__*/function () {
|
|
21
|
+
function Evaluator(context, options) {
|
|
22
|
+
if (options === void 0) {
|
|
23
|
+
options = {
|
|
24
|
+
defaultFilter: 'html'
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
this.options = options;
|
|
28
|
+
this.functions = {};
|
|
29
|
+
this.contextStack = [];
|
|
30
|
+
this.context = context;
|
|
31
|
+
this.contextStack.push(function (varname) {
|
|
32
|
+
return varname === '&' ? context : context === null || context === void 0 ? void 0 : context[varname];
|
|
33
|
+
});
|
|
34
|
+
this.filters = Object.assign(Object.assign(Object.assign({}, Evaluator.defaultFilters), this.filters), options === null || options === void 0 ? void 0 : options.filters);
|
|
35
|
+
this.functions = Object.assign(Object.assign(Object.assign({}, Evaluator.defaultFunctions), this.functions), options === null || options === void 0 ? void 0 : options.functions);
|
|
36
|
+
}
|
|
37
|
+
Evaluator.setDefaultFilters = function setDefaultFilters(filters) {
|
|
38
|
+
Evaluator.defaultFilters = Object.assign(Object.assign({}, Evaluator.defaultFilters), filters);
|
|
39
|
+
};
|
|
40
|
+
Evaluator.setDefaultFunctions = function setDefaultFunctions(funtions) {
|
|
41
|
+
Evaluator.defaultFunctions = Object.assign(Object.assign({}, Evaluator.defaultFunctions), funtions);
|
|
42
|
+
}
|
|
43
|
+
// 主入口
|
|
44
|
+
;
|
|
45
|
+
var _proto = Evaluator.prototype;
|
|
46
|
+
_proto.evalute = function evalute(ast) {
|
|
47
|
+
if (ast && ast.type) {
|
|
48
|
+
var name = ast.type.replace(/(?:_|\-)(\w)/g, function (_, l) {
|
|
49
|
+
return l.toUpperCase();
|
|
50
|
+
});
|
|
51
|
+
var fn = this.functions[name] || this[name];
|
|
52
|
+
if (!fn) {
|
|
53
|
+
throw new Error(ast.type + " unkown.");
|
|
54
|
+
}
|
|
55
|
+
return fn.call(this, ast);
|
|
56
|
+
} else {
|
|
57
|
+
return ast;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
_proto.document = function document(ast) {
|
|
61
|
+
var _this = this;
|
|
62
|
+
if (!ast.body.length) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
var isString = ast.body.length > 1;
|
|
66
|
+
var content = ast.body.map(function (item) {
|
|
67
|
+
var result = _this.evalute(item);
|
|
68
|
+
if (isString && result == null) {
|
|
69
|
+
// 不要出现 undefined, null 之类的文案
|
|
70
|
+
return '';
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
});
|
|
74
|
+
return content.length === 1 ? content[0] : content.join('');
|
|
75
|
+
};
|
|
76
|
+
_proto.filter = function filter(ast) {
|
|
77
|
+
var _this2 = this;
|
|
78
|
+
var input = this.evalute(ast.input);
|
|
79
|
+
var filters = ast.filters.concat();
|
|
80
|
+
var context = {
|
|
81
|
+
filter: undefined,
|
|
82
|
+
data: this.context,
|
|
83
|
+
restFilters: filters
|
|
84
|
+
};
|
|
85
|
+
while (filters.length) {
|
|
86
|
+
var filter = filters.shift();
|
|
87
|
+
var fn = this.filters[filter.name];
|
|
88
|
+
if (!fn) {
|
|
89
|
+
throw new Error("filter `" + filter.name + "` not exists.");
|
|
90
|
+
}
|
|
91
|
+
context.filter = filter;
|
|
92
|
+
input = fn.apply(context, [input].concat(filter.args.map(function (item) {
|
|
93
|
+
if ((item === null || item === void 0 ? void 0 : item.type) === 'mixed') {
|
|
94
|
+
return item.body.map(function (item) {
|
|
95
|
+
return typeof item === 'string' ? item : _this2.evalute(item);
|
|
96
|
+
}).join('');
|
|
97
|
+
} else if (item.type) {
|
|
98
|
+
return _this2.evalute(item);
|
|
99
|
+
}
|
|
100
|
+
return item;
|
|
101
|
+
})));
|
|
102
|
+
}
|
|
103
|
+
return input;
|
|
104
|
+
};
|
|
105
|
+
_proto.raw = function raw(ast) {
|
|
106
|
+
return ast.value;
|
|
107
|
+
};
|
|
108
|
+
_proto.script = function script(ast) {
|
|
109
|
+
var _a;
|
|
110
|
+
var defaultFilter = this.options.defaultFilter;
|
|
111
|
+
// 只给简单的变量取值用法自动补fitler
|
|
112
|
+
if (defaultFilter && ~['getter', 'variable'].indexOf((_a = ast.body) === null || _a === void 0 ? void 0 : _a.type)) {
|
|
113
|
+
ast.body = {
|
|
114
|
+
type: 'filter',
|
|
115
|
+
input: ast.body,
|
|
116
|
+
filters: [{
|
|
117
|
+
name: defaultFilter.replace(/^\s*\|\s*/, ''),
|
|
118
|
+
args: []
|
|
119
|
+
}]
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return this.evalute(ast.body);
|
|
123
|
+
};
|
|
124
|
+
_proto.expressionList = function expressionList(ast) {
|
|
125
|
+
var _this3 = this;
|
|
126
|
+
return ast.body.reduce(function (prev, current) {
|
|
127
|
+
return _this3.evalute(current);
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
_proto.template = function template(ast) {
|
|
131
|
+
var _this4 = this;
|
|
132
|
+
return ast.body.map(function (arg) {
|
|
133
|
+
return _this4.evalute(arg);
|
|
134
|
+
}).join('');
|
|
135
|
+
};
|
|
136
|
+
_proto.templateRaw = function templateRaw(ast) {
|
|
137
|
+
return ast.value;
|
|
138
|
+
}
|
|
139
|
+
// 下标获取
|
|
140
|
+
;
|
|
141
|
+
_proto.getter = function getter(ast) {
|
|
142
|
+
var _a;
|
|
143
|
+
var host = this.evalute(ast.host);
|
|
144
|
+
var key = this.evalute(ast.key);
|
|
145
|
+
if (typeof key === 'undefined' && ((_a = ast.key) === null || _a === void 0 ? void 0 : _a.type) === 'variable') {
|
|
146
|
+
key = ast.key.name;
|
|
147
|
+
}
|
|
148
|
+
return host === null || host === void 0 ? void 0 : host[key];
|
|
149
|
+
}
|
|
150
|
+
// 位操作如 +2 ~3 !
|
|
151
|
+
;
|
|
152
|
+
_proto.unary = function unary(ast) {
|
|
153
|
+
var value = this.evalute(ast.value);
|
|
154
|
+
switch (ast.op) {
|
|
155
|
+
case '+':
|
|
156
|
+
return +value;
|
|
157
|
+
case '-':
|
|
158
|
+
return -value;
|
|
159
|
+
case '~':
|
|
160
|
+
return ~value;
|
|
161
|
+
case '!':
|
|
162
|
+
return !value;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
_proto.formatNumber = function formatNumber(value, int) {
|
|
166
|
+
if (int === void 0) {
|
|
167
|
+
int = false;
|
|
168
|
+
}
|
|
169
|
+
var typeName = typeof value;
|
|
170
|
+
if (typeName === 'string') {
|
|
171
|
+
return (int ? parseInt(value, 10) : parseFloat(value)) || 0;
|
|
172
|
+
} else if (typeName === 'number' && int) {
|
|
173
|
+
return Math.round(value);
|
|
174
|
+
}
|
|
175
|
+
return value !== null && value !== void 0 ? value : 0;
|
|
176
|
+
};
|
|
177
|
+
_proto.power = function power(ast) {
|
|
178
|
+
var left = this.evalute(ast.left);
|
|
179
|
+
var right = this.evalute(ast.right);
|
|
180
|
+
return Math.pow(this.formatNumber(left), this.formatNumber(right));
|
|
181
|
+
};
|
|
182
|
+
_proto.multiply = function multiply(ast) {
|
|
183
|
+
var left = this.evalute(ast.left);
|
|
184
|
+
var right = this.evalute(ast.right);
|
|
185
|
+
return stripNumber(this.formatNumber(left) * this.formatNumber(right));
|
|
186
|
+
};
|
|
187
|
+
_proto.divide = function divide(ast) {
|
|
188
|
+
var left = this.evalute(ast.left);
|
|
189
|
+
var right = this.evalute(ast.right);
|
|
190
|
+
return stripNumber(this.formatNumber(left) / this.formatNumber(right));
|
|
191
|
+
};
|
|
192
|
+
_proto.remainder = function remainder(ast) {
|
|
193
|
+
var left = this.evalute(ast.left);
|
|
194
|
+
var right = this.evalute(ast.right);
|
|
195
|
+
return this.formatNumber(left) % this.formatNumber(right);
|
|
196
|
+
};
|
|
197
|
+
_proto.add = function add(ast) {
|
|
198
|
+
var left = this.evalute(ast.left);
|
|
199
|
+
var right = this.evalute(ast.right);
|
|
200
|
+
// 如果有一个不是数字就变成字符串拼接
|
|
201
|
+
if (isNaN(left) || isNaN(right)) {
|
|
202
|
+
return left + right;
|
|
203
|
+
}
|
|
204
|
+
return stripNumber(this.formatNumber(left) + this.formatNumber(right));
|
|
205
|
+
};
|
|
206
|
+
_proto.minus = function minus(ast) {
|
|
207
|
+
var left = this.evalute(ast.left);
|
|
208
|
+
var right = this.evalute(ast.right);
|
|
209
|
+
return stripNumber(this.formatNumber(left) - this.formatNumber(right));
|
|
210
|
+
};
|
|
211
|
+
_proto.shift = function shift(ast) {
|
|
212
|
+
var left = this.evalute(ast.left);
|
|
213
|
+
var right = this.formatNumber(this.evalute(ast.right), true);
|
|
214
|
+
if (ast.op === '<<') {
|
|
215
|
+
return left << right;
|
|
216
|
+
} else if (ast.op == '>>') {
|
|
217
|
+
return left >> right;
|
|
218
|
+
} else {
|
|
219
|
+
return left >>> right;
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
_proto.lt = function lt(ast) {
|
|
223
|
+
var left = this.evalute(ast.left);
|
|
224
|
+
var right = this.evalute(ast.right);
|
|
225
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
226
|
+
return left < right;
|
|
227
|
+
};
|
|
228
|
+
_proto.gt = function gt(ast) {
|
|
229
|
+
var left = this.evalute(ast.left);
|
|
230
|
+
var right = this.evalute(ast.right);
|
|
231
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
232
|
+
return left > right;
|
|
233
|
+
};
|
|
234
|
+
_proto.le = function le(ast) {
|
|
235
|
+
var left = this.evalute(ast.left);
|
|
236
|
+
var right = this.evalute(ast.right);
|
|
237
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
238
|
+
return left <= right;
|
|
239
|
+
};
|
|
240
|
+
_proto.ge = function ge(ast) {
|
|
241
|
+
var left = this.evalute(ast.left);
|
|
242
|
+
var right = this.evalute(ast.right);
|
|
243
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
244
|
+
return left >= right;
|
|
245
|
+
};
|
|
246
|
+
_proto.eq = function eq(ast) {
|
|
247
|
+
var left = this.evalute(ast.left);
|
|
248
|
+
var right = this.evalute(ast.right);
|
|
249
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
250
|
+
return left == right;
|
|
251
|
+
};
|
|
252
|
+
_proto.ne = function ne(ast) {
|
|
253
|
+
var left = this.evalute(ast.left);
|
|
254
|
+
var right = this.evalute(ast.right);
|
|
255
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
256
|
+
return left != right;
|
|
257
|
+
};
|
|
258
|
+
_proto.streq = function streq(ast) {
|
|
259
|
+
var left = this.evalute(ast.left);
|
|
260
|
+
var right = this.evalute(ast.right);
|
|
261
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
262
|
+
return left === right;
|
|
263
|
+
};
|
|
264
|
+
_proto.strneq = function strneq(ast) {
|
|
265
|
+
var left = this.evalute(ast.left);
|
|
266
|
+
var right = this.evalute(ast.right);
|
|
267
|
+
// todo 如果是日期的对比,这个地方可以优化一下。
|
|
268
|
+
return left !== right;
|
|
269
|
+
};
|
|
270
|
+
_proto.binary = function binary(ast) {
|
|
271
|
+
var left = this.evalute(ast.left);
|
|
272
|
+
var right = this.evalute(ast.right);
|
|
273
|
+
if (ast.op === '&') {
|
|
274
|
+
return left & right;
|
|
275
|
+
} else if (ast.op === '^') {
|
|
276
|
+
return left ^ right;
|
|
277
|
+
} else {
|
|
278
|
+
return left | right;
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
_proto.and = function and(ast) {
|
|
282
|
+
var left = this.evalute(ast.left);
|
|
283
|
+
return left && this.evalute(ast.right);
|
|
284
|
+
};
|
|
285
|
+
_proto.or = function or(ast) {
|
|
286
|
+
var left = this.evalute(ast.left);
|
|
287
|
+
return left || this.evalute(ast.right);
|
|
288
|
+
};
|
|
289
|
+
_proto.number = function number(ast) {
|
|
290
|
+
// todo 以后可以在这支持大数字。
|
|
291
|
+
return ast.value;
|
|
292
|
+
};
|
|
293
|
+
_proto.nsVariable = function nsVariable(ast) {
|
|
294
|
+
if (ast.namespace === 'window') {
|
|
295
|
+
this.contextStack.push(function (name) {
|
|
296
|
+
return name === '&' ? window : window[name];
|
|
297
|
+
});
|
|
298
|
+
} else if (ast.namespace === 'cookie') {
|
|
299
|
+
this.contextStack.push(function (name) {
|
|
300
|
+
return getCookie(name);
|
|
301
|
+
});
|
|
302
|
+
} else if (ast.namespace === 'ls' || ast.namespace === 'ss') {
|
|
303
|
+
var ns = ast.namespace;
|
|
304
|
+
this.contextStack.push(function (name) {
|
|
305
|
+
var raw = ns === 'ss' ? sessionStorage.getItem(name) : localStorage.getItem(name);
|
|
306
|
+
if (typeof raw === 'string') {
|
|
307
|
+
// 判断字符串是否一个纯数字字符串,如果是,则对比parse后的值和原值是否相同,
|
|
308
|
+
// 如果不同则返回原值,因为原值如果是一个很长的纯数字字符串,则 parse 后可能会丢失精度
|
|
309
|
+
if (/^\d+$/.test(raw)) {
|
|
310
|
+
var parsed = JSON.parse(raw);
|
|
311
|
+
return "" + parsed === raw ? parsed : raw;
|
|
312
|
+
}
|
|
313
|
+
return parseJson(raw, raw);
|
|
314
|
+
}
|
|
315
|
+
return undefined;
|
|
316
|
+
});
|
|
317
|
+
} else {
|
|
318
|
+
throw new Error('Unsupported namespace: ' + ast.namespace);
|
|
319
|
+
}
|
|
320
|
+
var result = this.evalute(ast.body);
|
|
321
|
+
this.contextStack.pop();
|
|
322
|
+
return result;
|
|
323
|
+
};
|
|
324
|
+
_proto.variable = function variable(ast) {
|
|
325
|
+
var contextGetter = this.contextStack[this.contextStack.length - 1];
|
|
326
|
+
return contextGetter(ast.name);
|
|
327
|
+
};
|
|
328
|
+
_proto.identifier = function identifier(ast) {
|
|
329
|
+
return ast.name;
|
|
330
|
+
};
|
|
331
|
+
_proto.array = function array(ast) {
|
|
332
|
+
var _this5 = this;
|
|
333
|
+
return ast.members.map(function (member) {
|
|
334
|
+
return _this5.evalute(member);
|
|
335
|
+
});
|
|
336
|
+
};
|
|
337
|
+
_proto.literal = function literal(ast) {
|
|
338
|
+
return ast.value;
|
|
339
|
+
};
|
|
340
|
+
_proto.string = function string(ast) {
|
|
341
|
+
return ast.value;
|
|
342
|
+
};
|
|
343
|
+
_proto.object = function object(ast) {
|
|
344
|
+
var _this6 = this;
|
|
345
|
+
var object = {};
|
|
346
|
+
ast.members.forEach(function (_ref) {
|
|
347
|
+
var key = _ref.key,
|
|
348
|
+
value = _ref.value;
|
|
349
|
+
object[_this6.evalute(key)] = _this6.evalute(value);
|
|
350
|
+
});
|
|
351
|
+
return object;
|
|
352
|
+
};
|
|
353
|
+
_proto.conditional = function conditional(ast) {
|
|
354
|
+
return this.evalute(ast.test) ? this.evalute(ast.consequent) : this.evalute(ast.alternate);
|
|
355
|
+
};
|
|
356
|
+
_proto.funcCall = function funcCall(ast) {
|
|
357
|
+
var _this7 = this;
|
|
358
|
+
var fnName = "fn" + ast.identifier;
|
|
359
|
+
var fn = this.functions[fnName] || this[fnName] || this.filters.hasOwnProperty(ast.identifier) && this.filters[ast.identifier];
|
|
360
|
+
if (!fn) {
|
|
361
|
+
throw new Error(ast.identifier + "\u51FD\u6570\u6CA1\u6709\u5B9A\u4E49");
|
|
362
|
+
}
|
|
363
|
+
var args = ast.args;
|
|
364
|
+
// 逻辑函数特殊处理,因为有时候有些运算是可以跳过的。
|
|
365
|
+
if (~['IF', 'AND', 'OR', 'XOR', 'IFS'].indexOf(ast.identifier)) {
|
|
366
|
+
args = args.map(function (a) {
|
|
367
|
+
return function () {
|
|
368
|
+
return _this7.evalute(a);
|
|
369
|
+
};
|
|
370
|
+
});
|
|
371
|
+
} else {
|
|
372
|
+
args = args.map(function (a) {
|
|
373
|
+
return _this7.evalute(a);
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
return fn.apply(this, args);
|
|
377
|
+
};
|
|
378
|
+
_proto.anonymousFunction = function anonymousFunction(ast) {
|
|
379
|
+
return ast;
|
|
380
|
+
};
|
|
381
|
+
_proto.callAnonymousFunction = function callAnonymousFunction(ast, args) {
|
|
382
|
+
var ctx = createObject(this.contextStack[this.contextStack.length - 1]('&') || {}, {});
|
|
383
|
+
ast.args.forEach(function (arg) {
|
|
384
|
+
if (arg.type !== 'variable') {
|
|
385
|
+
throw new Error('expected a variable as argument');
|
|
386
|
+
}
|
|
387
|
+
ctx[arg.name] = args.shift();
|
|
388
|
+
});
|
|
389
|
+
this.contextStack.push(function (varName) {
|
|
390
|
+
return varName === '&' ? ctx : ctx[varName];
|
|
391
|
+
});
|
|
392
|
+
var result = this.evalute(ast.return);
|
|
393
|
+
this.contextStack.pop();
|
|
394
|
+
return result;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* 示例:IF(A, B, C)
|
|
398
|
+
*
|
|
399
|
+
* 如果满足条件A,则返回B,否则返回C,支持多层嵌套IF函数。
|
|
400
|
+
*
|
|
401
|
+
* 也可以用表达式如:A ? B : C
|
|
402
|
+
*
|
|
403
|
+
* @example IF(condition, consequent, alternate)
|
|
404
|
+
* @param {expression} condition - 条件表达式.
|
|
405
|
+
* @param {any} consequent 条件判断通过的返回结果
|
|
406
|
+
* @param {any} alternate 条件判断不通过的返回结果
|
|
407
|
+
* @namespace 逻辑函数
|
|
408
|
+
*
|
|
409
|
+
* @returns {any} 根据条件返回不同的结果
|
|
410
|
+
*/;
|
|
411
|
+
_proto.fnIF = function fnIF(condition, trueValue, falseValue) {
|
|
412
|
+
return condition() ? trueValue() : falseValue();
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* 条件全部符合,返回 true,否则返回 false
|
|
416
|
+
*
|
|
417
|
+
* 示例:AND(语文成绩>80, 数学成绩>80)
|
|
418
|
+
*
|
|
419
|
+
* 语文成绩和数学成绩都大于 80,则返回 true,否则返回 false
|
|
420
|
+
*
|
|
421
|
+
* 也可以直接用表达式如:语文成绩>80 && 数学成绩>80
|
|
422
|
+
*
|
|
423
|
+
* @example AND(expression1, expression2, ...expressionN)
|
|
424
|
+
* @param {...expression} conditions - 条件表达式.
|
|
425
|
+
* @namespace 逻辑函数
|
|
426
|
+
*
|
|
427
|
+
* @returns {boolean}
|
|
428
|
+
*/;
|
|
429
|
+
_proto.fnAND = function fnAND() {
|
|
430
|
+
for (var _len = arguments.length, condtions = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
431
|
+
condtions[_key] = arguments[_key];
|
|
432
|
+
}
|
|
433
|
+
return condtions.every(function (c) {
|
|
434
|
+
return c();
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* 条件任意一个满足条件,返回 true,否则返回 false
|
|
439
|
+
*
|
|
440
|
+
* 示例:OR(语文成绩>80, 数学成绩>80)
|
|
441
|
+
*
|
|
442
|
+
* 语文成绩和数学成绩任意一个大于 80,则返回 true,否则返回 false
|
|
443
|
+
*
|
|
444
|
+
* 也可以直接用表达式如:语文成绩>80 || 数学成绩>80
|
|
445
|
+
*
|
|
446
|
+
* @example OR(expression1, expression2, ...expressionN)
|
|
447
|
+
* @param {...expression} conditions - 条件表达式.
|
|
448
|
+
* @namespace 逻辑函数
|
|
449
|
+
*
|
|
450
|
+
* @returns {boolean}
|
|
451
|
+
*/;
|
|
452
|
+
_proto.fnOR = function fnOR() {
|
|
453
|
+
for (var _len2 = arguments.length, condtions = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
454
|
+
condtions[_key2] = arguments[_key2];
|
|
455
|
+
}
|
|
456
|
+
return condtions.some(function (c) {
|
|
457
|
+
return c();
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* 异或处理,多个表达式组中存在奇数个真时认为真。
|
|
462
|
+
*
|
|
463
|
+
* @example XOR(condition1, condition2)
|
|
464
|
+
* @param {expression} condition1 - 条件表达式1
|
|
465
|
+
* @param {expression} condition2 - 条件表达式2
|
|
466
|
+
* @namespace 逻辑函数
|
|
467
|
+
*
|
|
468
|
+
* @returns {boolean}
|
|
469
|
+
*/;
|
|
470
|
+
_proto.fnXOR = function fnXOR() {
|
|
471
|
+
for (var _len3 = arguments.length, condtions = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
|
472
|
+
condtions[_key3] = arguments[_key3];
|
|
473
|
+
}
|
|
474
|
+
return !!(condtions.filter(function (c) {
|
|
475
|
+
return c();
|
|
476
|
+
}).length % 2);
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* 判断函数集合,相当于多个 else if 合并成一个。
|
|
480
|
+
*
|
|
481
|
+
* 示例:IFS(语文成绩 > 80, "优秀", 语文成绩 > 60, "良", "继续努力")
|
|
482
|
+
*
|
|
483
|
+
* 如果语文成绩大于 80,则返回优秀,否则判断大于 60 分,则返回良,否则返回继续努力。
|
|
484
|
+
*
|
|
485
|
+
* @example IFS(condition1, result1, condition2, result2,...conditionN, resultN)
|
|
486
|
+
* @param {...any} args - 条件,返回值集合
|
|
487
|
+
* @namespace 逻辑函数
|
|
488
|
+
* @returns {any} 第一个满足条件的结果,没有命中的返回 false。
|
|
489
|
+
*/;
|
|
490
|
+
_proto.fnIFS = function fnIFS() {
|
|
491
|
+
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
492
|
+
args[_key4] = arguments[_key4];
|
|
493
|
+
}
|
|
494
|
+
if (args.length % 2) {
|
|
495
|
+
args.splice(args.length - 1, 0, function () {
|
|
496
|
+
return true;
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
while (args.length) {
|
|
500
|
+
var c = args.shift();
|
|
501
|
+
var v = args.shift();
|
|
502
|
+
if (c()) {
|
|
503
|
+
return v();
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* 返回传入数字的绝对值
|
|
510
|
+
*
|
|
511
|
+
* @example ABS(num)
|
|
512
|
+
* @param {number} num - 数值
|
|
513
|
+
* @namespace 数学函数
|
|
514
|
+
*
|
|
515
|
+
* @returns {number} 传入数值的绝对值
|
|
516
|
+
*/;
|
|
517
|
+
_proto.fnABS = function fnABS(a) {
|
|
518
|
+
a = this.formatNumber(a);
|
|
519
|
+
return Math.abs(a);
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* 获取最大值,如果只有一个参数且是数组,则计算这个数组内的值
|
|
523
|
+
*
|
|
524
|
+
* @example MAX(num1, num2, ...numN)
|
|
525
|
+
* @param {...number} num - 数值
|
|
526
|
+
* @namespace 数学函数
|
|
527
|
+
*
|
|
528
|
+
* @returns {number} 所有传入值中最大的那个
|
|
529
|
+
*/;
|
|
530
|
+
_proto.fnMAX = function fnMAX() {
|
|
531
|
+
var _this8 = this;
|
|
532
|
+
for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
|
|
533
|
+
args[_key5] = arguments[_key5];
|
|
534
|
+
}
|
|
535
|
+
var arr = normalizeArgs(args);
|
|
536
|
+
return Math.max.apply(Math, arr.map(function (item) {
|
|
537
|
+
return _this8.formatNumber(item);
|
|
538
|
+
}));
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* 获取最小值,如果只有一个参数且是数组,则计算这个数组内的值
|
|
542
|
+
*
|
|
543
|
+
* @example MIN(num1, num2, ...numN)
|
|
544
|
+
* @param {...number} num - 数值
|
|
545
|
+
* @namespace 数学函数
|
|
546
|
+
*
|
|
547
|
+
* @returns {number} 所有传入值中最小的那个
|
|
548
|
+
*/;
|
|
549
|
+
_proto.fnMIN = function fnMIN() {
|
|
550
|
+
var _this9 = this;
|
|
551
|
+
for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
|
|
552
|
+
args[_key6] = arguments[_key6];
|
|
553
|
+
}
|
|
554
|
+
var arr = normalizeArgs(args);
|
|
555
|
+
return Math.min.apply(Math, arr.map(function (item) {
|
|
556
|
+
return _this9.formatNumber(item);
|
|
557
|
+
}));
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* 求和,如果只有一个参数且是数组,则计算这个数组内的值
|
|
561
|
+
*
|
|
562
|
+
* @example SUM(num1, num2, ...numN)
|
|
563
|
+
* @param {...number} num - 数值
|
|
564
|
+
* @namespace 数学函数
|
|
565
|
+
*
|
|
566
|
+
* @returns {number} 所有传入数值的总和
|
|
567
|
+
*/;
|
|
568
|
+
_proto.fnSUM = function fnSUM() {
|
|
569
|
+
var _this10 = this;
|
|
570
|
+
for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
|
|
571
|
+
args[_key7] = arguments[_key7];
|
|
572
|
+
}
|
|
573
|
+
var arr = normalizeArgs(args);
|
|
574
|
+
return arr.reduce(function (sum, a) {
|
|
575
|
+
return sum + _this10.formatNumber(a) || 0;
|
|
576
|
+
}, 0);
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* 将数值向下取整为最接近的整数
|
|
580
|
+
*
|
|
581
|
+
* @example INT(num)
|
|
582
|
+
* @param {number} num - 数值
|
|
583
|
+
* @namespace 数学函数
|
|
584
|
+
*
|
|
585
|
+
* @returns {number} 数值对应的整形
|
|
586
|
+
*/;
|
|
587
|
+
_proto.fnINT = function fnINT(n) {
|
|
588
|
+
return Math.floor(this.formatNumber(n));
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* 返回两数相除的余数,参数 number 是被除数,divisor 是除数
|
|
592
|
+
*
|
|
593
|
+
* @example MOD(num, divisor)
|
|
594
|
+
* @param {number} num - 被除数
|
|
595
|
+
* @param {number} divisor - 除数
|
|
596
|
+
* @namespace 数学函数
|
|
597
|
+
*
|
|
598
|
+
* @returns {number} 两数相除的余数
|
|
599
|
+
*/;
|
|
600
|
+
_proto.fnMOD = function fnMOD(a, b) {
|
|
601
|
+
return this.formatNumber(a) % this.formatNumber(b);
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* 圆周率 3.1415...
|
|
605
|
+
*
|
|
606
|
+
* @example PI()
|
|
607
|
+
* @namespace 数学函数
|
|
608
|
+
*
|
|
609
|
+
* @returns {number} 圆周率数值
|
|
610
|
+
*/;
|
|
611
|
+
_proto.fnPI = function fnPI() {
|
|
612
|
+
return Math.PI;
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* 将数字四舍五入到指定的位数,可以设置小数位。
|
|
616
|
+
*
|
|
617
|
+
* @example ROUND(num[, numDigits = 2])
|
|
618
|
+
* @param {number} num - 要处理的数字
|
|
619
|
+
* @param {number} numDigits - 小数位数
|
|
620
|
+
* @namespace 数学函数
|
|
621
|
+
*
|
|
622
|
+
* @returns {number} 传入数值四舍五入后的结果
|
|
623
|
+
*/;
|
|
624
|
+
_proto.fnROUND = function fnROUND(a, b) {
|
|
625
|
+
if (b === void 0) {
|
|
626
|
+
b = 2;
|
|
627
|
+
}
|
|
628
|
+
a = this.formatNumber(a);
|
|
629
|
+
b = this.formatNumber(b);
|
|
630
|
+
var bResult = Math.round(b);
|
|
631
|
+
if (bResult) {
|
|
632
|
+
var c = Math.pow(10, bResult);
|
|
633
|
+
return Math.round(a * c) / c;
|
|
634
|
+
}
|
|
635
|
+
return Math.round(a);
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* 将数字向下取整到指定的位数,可以设置小数位。
|
|
639
|
+
*
|
|
640
|
+
* @example FLOOR(num[, numDigits=2])
|
|
641
|
+
* @param {number} num - 要处理的数字
|
|
642
|
+
* @param {number} numDigits - 小数位数
|
|
643
|
+
* @namespace 数学函数
|
|
644
|
+
*
|
|
645
|
+
* @returns {number} 传入数值向下取整后的结果
|
|
646
|
+
*/;
|
|
647
|
+
_proto.fnFLOOR = function fnFLOOR(a, b) {
|
|
648
|
+
if (b === void 0) {
|
|
649
|
+
b = 2;
|
|
650
|
+
}
|
|
651
|
+
a = this.formatNumber(a);
|
|
652
|
+
b = this.formatNumber(b);
|
|
653
|
+
var bResult = Math.round(b);
|
|
654
|
+
if (bResult) {
|
|
655
|
+
var c = Math.pow(10, bResult);
|
|
656
|
+
return Math.floor(a * c) / c;
|
|
657
|
+
}
|
|
658
|
+
return Math.floor(a);
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* 将数字向上取整到指定的位数,可以设置小数位。
|
|
662
|
+
*
|
|
663
|
+
* @example CEIL(num[, numDigits=2])
|
|
664
|
+
* @param {number} num - 要处理的数字
|
|
665
|
+
* @param {number} numDigits - 小数位数
|
|
666
|
+
* @namespace 数学函数
|
|
667
|
+
*
|
|
668
|
+
* @returns {number} 传入数值向上取整后的结果
|
|
669
|
+
*/;
|
|
670
|
+
_proto.fnCEIL = function fnCEIL(a, b) {
|
|
671
|
+
if (b === void 0) {
|
|
672
|
+
b = 2;
|
|
673
|
+
}
|
|
674
|
+
a = this.formatNumber(a);
|
|
675
|
+
b = this.formatNumber(b);
|
|
676
|
+
var bResult = Math.round(b);
|
|
677
|
+
if (bResult) {
|
|
678
|
+
var c = Math.pow(10, bResult);
|
|
679
|
+
return Math.ceil(a * c) / c;
|
|
680
|
+
}
|
|
681
|
+
return Math.ceil(a);
|
|
682
|
+
}
|
|
683
|
+
/**
|
|
684
|
+
* 开平方,参数 number 为非负数
|
|
685
|
+
*
|
|
686
|
+
* @example SQRT(num)
|
|
687
|
+
* @param {number} num - 要处理的数字
|
|
688
|
+
* @namespace 数学函数
|
|
689
|
+
*
|
|
690
|
+
* @returns {number} 开平方的结果
|
|
691
|
+
*/;
|
|
692
|
+
_proto.fnSQRT = function fnSQRT(n) {
|
|
693
|
+
return Math.sqrt(this.formatNumber(n));
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* 返回所有参数的平均值,如果只有一个参数且是数组,则计算这个数组内的值
|
|
697
|
+
*
|
|
698
|
+
* @example AVG(num1, num2, ...numN)
|
|
699
|
+
* @param {...number} num - 要处理的数字
|
|
700
|
+
* @namespace 数学函数
|
|
701
|
+
*
|
|
702
|
+
* @returns {number} 所有数值的平均值
|
|
703
|
+
*/;
|
|
704
|
+
_proto.fnAVG = function fnAVG() {
|
|
705
|
+
var _this11 = this;
|
|
706
|
+
for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
|
|
707
|
+
args[_key8] = arguments[_key8];
|
|
708
|
+
}
|
|
709
|
+
var arr = normalizeArgs(args);
|
|
710
|
+
return this.fnSUM.apply(this, arr.map(function (item) {
|
|
711
|
+
return _this11.formatNumber(item);
|
|
712
|
+
})) / arr.length;
|
|
713
|
+
}
|
|
714
|
+
/**
|
|
715
|
+
* 返回数据点与数据均值点之差(数据偏差)的平方和,如果只有一个参数且是数组,则计算这个数组内的值
|
|
716
|
+
*
|
|
717
|
+
* @example DEVSQ(num1, num2, ...numN)
|
|
718
|
+
* @param {...number} num - 要处理的数字
|
|
719
|
+
* @namespace 数学函数
|
|
720
|
+
*
|
|
721
|
+
* @returns {number} 所有数值的平均值
|
|
722
|
+
*/;
|
|
723
|
+
_proto.fnDEVSQ = function fnDEVSQ() {
|
|
724
|
+
var _this12 = this;
|
|
725
|
+
for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
|
|
726
|
+
args[_key9] = arguments[_key9];
|
|
727
|
+
}
|
|
728
|
+
if (args.length === 0) {
|
|
729
|
+
return null;
|
|
730
|
+
}
|
|
731
|
+
var arr = normalizeArgs(args);
|
|
732
|
+
var nums = arr.map(function (item) {
|
|
733
|
+
return _this12.formatNumber(item);
|
|
734
|
+
});
|
|
735
|
+
var sum = nums.reduce(function (sum, a) {
|
|
736
|
+
return sum + a || 0;
|
|
737
|
+
}, 0);
|
|
738
|
+
var mean = sum / nums.length;
|
|
739
|
+
var result = 0;
|
|
740
|
+
for (var _iterator = _createForOfIteratorHelperLoose(nums), _step; !(_step = _iterator()).done;) {
|
|
741
|
+
var num = _step.value;
|
|
742
|
+
result += Math.pow(num - mean, 2);
|
|
743
|
+
}
|
|
744
|
+
return result;
|
|
745
|
+
}
|
|
746
|
+
/**
|
|
747
|
+
* 数据点到其算术平均值的绝对偏差的平均值
|
|
748
|
+
*
|
|
749
|
+
* @example AVEDEV(num1, num2, ...numN)
|
|
750
|
+
* @param {...number} num - 要处理的数字
|
|
751
|
+
* @namespace 数学函数
|
|
752
|
+
*
|
|
753
|
+
* @returns {number} 所有数值的平均值
|
|
754
|
+
*/;
|
|
755
|
+
_proto.fnAVEDEV = function fnAVEDEV() {
|
|
756
|
+
var _this13 = this;
|
|
757
|
+
for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
|
|
758
|
+
args[_key10] = arguments[_key10];
|
|
759
|
+
}
|
|
760
|
+
if (args.length === 0) {
|
|
761
|
+
return null;
|
|
762
|
+
}
|
|
763
|
+
var arr = args;
|
|
764
|
+
if (args.length === 1 && Array.isArray(args[0])) {
|
|
765
|
+
arr = args[0];
|
|
766
|
+
}
|
|
767
|
+
var nums = arr.map(function (item) {
|
|
768
|
+
return _this13.formatNumber(item);
|
|
769
|
+
});
|
|
770
|
+
var sum = nums.reduce(function (sum, a) {
|
|
771
|
+
return sum + a || 0;
|
|
772
|
+
}, 0);
|
|
773
|
+
var mean = sum / nums.length;
|
|
774
|
+
var result = 0;
|
|
775
|
+
for (var _iterator2 = _createForOfIteratorHelperLoose(nums), _step2; !(_step2 = _iterator2()).done;) {
|
|
776
|
+
var num = _step2.value;
|
|
777
|
+
result += Math.abs(num - mean);
|
|
778
|
+
}
|
|
779
|
+
return result / nums.length;
|
|
780
|
+
}
|
|
781
|
+
/**
|
|
782
|
+
* 数据点的调和平均值,如果只有一个参数且是数组,则计算这个数组内的值
|
|
783
|
+
*
|
|
784
|
+
* @example HARMEAN(num1, num2, ...numN)
|
|
785
|
+
* @param {...number} num - 要处理的数字
|
|
786
|
+
* @namespace 数学函数
|
|
787
|
+
*
|
|
788
|
+
* @returns {number} 所有数值的平均值
|
|
789
|
+
*/;
|
|
790
|
+
_proto.fnHARMEAN = function fnHARMEAN() {
|
|
791
|
+
var _this14 = this;
|
|
792
|
+
for (var _len11 = arguments.length, args = new Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
|
|
793
|
+
args[_key11] = arguments[_key11];
|
|
794
|
+
}
|
|
795
|
+
if (args.length === 0) {
|
|
796
|
+
return null;
|
|
797
|
+
}
|
|
798
|
+
var arr = args;
|
|
799
|
+
if (args.length === 1 && Array.isArray(args[0])) {
|
|
800
|
+
arr = args[0];
|
|
801
|
+
}
|
|
802
|
+
var nums = arr.map(function (item) {
|
|
803
|
+
return _this14.formatNumber(item);
|
|
804
|
+
});
|
|
805
|
+
var den = 0;
|
|
806
|
+
for (var _iterator3 = _createForOfIteratorHelperLoose(nums), _step3; !(_step3 = _iterator3()).done;) {
|
|
807
|
+
var num = _step3.value;
|
|
808
|
+
den += 1 / num;
|
|
809
|
+
}
|
|
810
|
+
return nums.length / den;
|
|
811
|
+
}
|
|
812
|
+
/**
|
|
813
|
+
* 数据集中第 k 个最大值
|
|
814
|
+
*
|
|
815
|
+
* @example LARGE(array, k)
|
|
816
|
+
* @param {array} nums - 要处理的数字
|
|
817
|
+
* @param {number} k - 第几大
|
|
818
|
+
* @namespace 数学函数
|
|
819
|
+
*
|
|
820
|
+
* @returns {number} 所有数值的平均值
|
|
821
|
+
*/;
|
|
822
|
+
_proto.fnLARGE = function fnLARGE(nums, k) {
|
|
823
|
+
var _this15 = this;
|
|
824
|
+
if (nums.length === 0) {
|
|
825
|
+
return null;
|
|
826
|
+
}
|
|
827
|
+
var numsFormat = nums.map(function (item) {
|
|
828
|
+
return _this15.formatNumber(item);
|
|
829
|
+
});
|
|
830
|
+
if (k < 0 || numsFormat.length < k) {
|
|
831
|
+
return null;
|
|
832
|
+
}
|
|
833
|
+
return numsFormat.sort(function (a, b) {
|
|
834
|
+
return b - a;
|
|
835
|
+
})[k - 1];
|
|
836
|
+
}
|
|
837
|
+
/**
|
|
838
|
+
* 将数值转为中文大写金额
|
|
839
|
+
*
|
|
840
|
+
* @example UPPERMONEY(num)
|
|
841
|
+
* @param {number} num - 要处理的数字
|
|
842
|
+
* @namespace 数学函数
|
|
843
|
+
*
|
|
844
|
+
* @returns {string} 数值中文大写字符
|
|
845
|
+
*/;
|
|
846
|
+
_proto.fnUPPERMONEY = function fnUPPERMONEY(n) {
|
|
847
|
+
var _a;
|
|
848
|
+
n = this.formatNumber(n);
|
|
849
|
+
var maxLen = 14;
|
|
850
|
+
if (((_a = n.toString().split('.')[0]) === null || _a === void 0 ? void 0 : _a.length) > maxLen) {
|
|
851
|
+
return "\u6700\u5927\u6570\u989D\u53EA\u652F\u6301\u5230\u5146(\u65E2\u5C0F\u6570\u70B9\u524D" + maxLen + "\u4F4D)";
|
|
852
|
+
}
|
|
853
|
+
var fraction = ['角', '分'];
|
|
854
|
+
var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
|
|
855
|
+
var unit = [['元', '万', '亿', '兆'], ['', '拾', '佰', '仟']];
|
|
856
|
+
var head = n < 0 ? '欠' : '';
|
|
857
|
+
n = Math.abs(n);
|
|
858
|
+
var s = '';
|
|
859
|
+
for (var i = 0; i < fraction.length; i++) {
|
|
860
|
+
s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
|
|
861
|
+
}
|
|
862
|
+
s = s || '整';
|
|
863
|
+
n = Math.floor(n);
|
|
864
|
+
for (var _i = 0; _i < unit[0].length && n > 0; _i++) {
|
|
865
|
+
var p = '';
|
|
866
|
+
for (var j = 0; j < unit[1].length && n > 0; j++) {
|
|
867
|
+
p = digit[n % 10] + unit[1][j] + p;
|
|
868
|
+
n = Math.floor(n / 10);
|
|
869
|
+
}
|
|
870
|
+
s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][_i] + s;
|
|
871
|
+
}
|
|
872
|
+
return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
|
|
873
|
+
}
|
|
874
|
+
/**
|
|
875
|
+
* 返回大于等于 0 且小于 1 的均匀分布随机实数。每一次触发计算都会变化。
|
|
876
|
+
*
|
|
877
|
+
* 示例:`RAND()*100`
|
|
878
|
+
*
|
|
879
|
+
* 返回 0-100 之间的随机数
|
|
880
|
+
*
|
|
881
|
+
* @example RAND()
|
|
882
|
+
* @namespace 数学函数
|
|
883
|
+
*
|
|
884
|
+
* @returns {number} 随机数
|
|
885
|
+
*/;
|
|
886
|
+
_proto.fnRAND = function fnRAND() {
|
|
887
|
+
return Math.random();
|
|
888
|
+
}
|
|
889
|
+
/**
|
|
890
|
+
* 取数据最后一个
|
|
891
|
+
*
|
|
892
|
+
* @example LAST(array)
|
|
893
|
+
* @param {...number} arr - 要处理的数组
|
|
894
|
+
* @namespace 数学函数
|
|
895
|
+
*
|
|
896
|
+
* @returns {any} 最后一个值
|
|
897
|
+
*/;
|
|
898
|
+
_proto.fnLAST = function fnLAST(arr) {
|
|
899
|
+
return arr.length ? arr[arr.length - 1] : null;
|
|
900
|
+
}
|
|
901
|
+
// 文本函数
|
|
902
|
+
;
|
|
903
|
+
_proto.normalizeText = function normalizeText(raw) {
|
|
904
|
+
if (raw instanceof Date) {
|
|
905
|
+
return (0, _moment.default)(raw).format();
|
|
906
|
+
}
|
|
907
|
+
return "" + raw;
|
|
908
|
+
}
|
|
909
|
+
/**
|
|
910
|
+
* 返回传入文本左侧的指定长度字符串。
|
|
911
|
+
*
|
|
912
|
+
* @example LEFT(text, len)
|
|
913
|
+
* @param {string} text - 要处理的文本
|
|
914
|
+
* @param {number} len - 要处理的长度
|
|
915
|
+
* @namespace 文本函数
|
|
916
|
+
*
|
|
917
|
+
* @returns {string} 对应字符串
|
|
918
|
+
*/;
|
|
919
|
+
_proto.fnLEFT = function fnLEFT(text, len) {
|
|
920
|
+
text = this.normalizeText(text);
|
|
921
|
+
return text.substring(0, len);
|
|
922
|
+
}
|
|
923
|
+
/**
|
|
924
|
+
* 返回传入文本右侧的指定长度字符串。
|
|
925
|
+
*
|
|
926
|
+
* @example RIGHT(text, len)
|
|
927
|
+
* @param {string} text - 要处理的文本
|
|
928
|
+
* @param {number} len - 要处理的长度
|
|
929
|
+
* @namespace 文本函数
|
|
930
|
+
*
|
|
931
|
+
* @returns {string} 对应字符串
|
|
932
|
+
*/;
|
|
933
|
+
_proto.fnRIGHT = function fnRIGHT(text, len) {
|
|
934
|
+
text = this.normalizeText(text);
|
|
935
|
+
return text.substring(text.length - len, text.length);
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
938
|
+
* 计算文本的长度
|
|
939
|
+
*
|
|
940
|
+
* @example LEN(text)
|
|
941
|
+
* @param {string} text - 要处理的文本
|
|
942
|
+
* @namespace 文本函数
|
|
943
|
+
*
|
|
944
|
+
* @returns {number} 长度
|
|
945
|
+
*/;
|
|
946
|
+
_proto.fnLEN = function fnLEN(text) {
|
|
947
|
+
text = this.normalizeText(text);
|
|
948
|
+
return text === null || text === void 0 ? void 0 : text.length;
|
|
949
|
+
}
|
|
950
|
+
/**
|
|
951
|
+
* 计算文本集合中所有文本的长度
|
|
952
|
+
*
|
|
953
|
+
* @example LENGTH(textArr)
|
|
954
|
+
* @param {string[]} textArr - 要处理的文本集合
|
|
955
|
+
* @namespace 文本函数
|
|
956
|
+
*
|
|
957
|
+
* @returns {number[]} 长度集合
|
|
958
|
+
*/;
|
|
959
|
+
_proto.fnLENGTH = function fnLENGTH() {
|
|
960
|
+
for (var _len12 = arguments.length, args = new Array(_len12), _key12 = 0; _key12 < _len12; _key12++) {
|
|
961
|
+
args[_key12] = arguments[_key12];
|
|
962
|
+
}
|
|
963
|
+
return this.fnLEN.call(this, args);
|
|
964
|
+
}
|
|
965
|
+
/**
|
|
966
|
+
* 判断文本是否为空
|
|
967
|
+
*
|
|
968
|
+
* @example ISEMPTY(text)
|
|
969
|
+
* @param {string} text - 要处理的文本
|
|
970
|
+
* @namespace 文本函数
|
|
971
|
+
*
|
|
972
|
+
* @returns {boolean} 判断结果
|
|
973
|
+
*/;
|
|
974
|
+
_proto.fnISEMPTY = function fnISEMPTY(text) {
|
|
975
|
+
return !text || !String(text).trim();
|
|
976
|
+
}
|
|
977
|
+
/**
|
|
978
|
+
* 将多个传入值连接成文本
|
|
979
|
+
*
|
|
980
|
+
* @example CONCATENATE(text1, text2, ...textN)
|
|
981
|
+
* @param {...string} text - 文本集合
|
|
982
|
+
* @namespace 文本函数
|
|
983
|
+
*
|
|
984
|
+
* @returns {string} 连接后的文本
|
|
985
|
+
*/;
|
|
986
|
+
_proto.fnCONCATENATE = function fnCONCATENATE() {
|
|
987
|
+
for (var _len13 = arguments.length, args = new Array(_len13), _key13 = 0; _key13 < _len13; _key13++) {
|
|
988
|
+
args[_key13] = arguments[_key13];
|
|
989
|
+
}
|
|
990
|
+
return args.join('');
|
|
991
|
+
}
|
|
992
|
+
/**
|
|
993
|
+
* 返回计算机字符集的数字代码所对应的字符。
|
|
994
|
+
*
|
|
995
|
+
* `CHAR(97)` 等价于 "a"
|
|
996
|
+
*
|
|
997
|
+
* @example CHAR(code)
|
|
998
|
+
* @param {number} code - 编码值
|
|
999
|
+
* @namespace 文本函数
|
|
1000
|
+
*
|
|
1001
|
+
* @returns {string} 指定位置的字符
|
|
1002
|
+
*/;
|
|
1003
|
+
_proto.fnCHAR = function fnCHAR(code) {
|
|
1004
|
+
return String.fromCharCode(code);
|
|
1005
|
+
}
|
|
1006
|
+
/**
|
|
1007
|
+
* 将传入文本转成小写
|
|
1008
|
+
*
|
|
1009
|
+
* @example LOWER(text)
|
|
1010
|
+
* @param {string} text - 文本
|
|
1011
|
+
* @namespace 文本函数
|
|
1012
|
+
*
|
|
1013
|
+
* @returns {string} 结果文本
|
|
1014
|
+
*/;
|
|
1015
|
+
_proto.fnLOWER = function fnLOWER(text) {
|
|
1016
|
+
text = this.normalizeText(text);
|
|
1017
|
+
return text.toLowerCase();
|
|
1018
|
+
}
|
|
1019
|
+
/**
|
|
1020
|
+
* 将传入文本转成大写
|
|
1021
|
+
*
|
|
1022
|
+
* @example UPPER(text)
|
|
1023
|
+
* @param {string} text - 文本
|
|
1024
|
+
* @namespace 文本函数
|
|
1025
|
+
*
|
|
1026
|
+
* @returns {string} 结果文本
|
|
1027
|
+
*/;
|
|
1028
|
+
_proto.fnUPPER = function fnUPPER(text) {
|
|
1029
|
+
text = this.normalizeText(text);
|
|
1030
|
+
return text.toUpperCase();
|
|
1031
|
+
}
|
|
1032
|
+
/**
|
|
1033
|
+
* 将传入文本首字母转成大写
|
|
1034
|
+
*
|
|
1035
|
+
* @example UPPERFIRST(text)
|
|
1036
|
+
* @param {string} text - 文本
|
|
1037
|
+
* @namespace 文本函数
|
|
1038
|
+
*
|
|
1039
|
+
* @returns {string} 结果文本
|
|
1040
|
+
*/;
|
|
1041
|
+
_proto.fnUPPERFIRST = function fnUPPERFIRST(text) {
|
|
1042
|
+
text = this.normalizeText(text);
|
|
1043
|
+
return (0, _upperFirst.default)(text);
|
|
1044
|
+
}
|
|
1045
|
+
/**
|
|
1046
|
+
* 向前补齐文本长度
|
|
1047
|
+
*
|
|
1048
|
+
* 示例 `PADSTART("6", 2, "0")`
|
|
1049
|
+
*
|
|
1050
|
+
* 返回 `06`
|
|
1051
|
+
*
|
|
1052
|
+
* @example PADSTART(text)
|
|
1053
|
+
* @param {string} text - 文本
|
|
1054
|
+
* @param {number} num - 目标长度
|
|
1055
|
+
* @param {string} pad - 用于补齐的文本
|
|
1056
|
+
* @namespace 文本函数
|
|
1057
|
+
*
|
|
1058
|
+
* @returns {string} 结果文本
|
|
1059
|
+
*/;
|
|
1060
|
+
_proto.fnPADSTART = function fnPADSTART(text, num, pad) {
|
|
1061
|
+
text = this.normalizeText(text);
|
|
1062
|
+
return (0, _padStart.default)(text, num, pad);
|
|
1063
|
+
}
|
|
1064
|
+
/**
|
|
1065
|
+
* 将文本转成标题
|
|
1066
|
+
*
|
|
1067
|
+
* 示例 `CAPITALIZE("star")`
|
|
1068
|
+
*
|
|
1069
|
+
* 返回 `Star`
|
|
1070
|
+
*
|
|
1071
|
+
* @example CAPITALIZE(text)
|
|
1072
|
+
* @param {string} text - 文本
|
|
1073
|
+
* @namespace 文本函数
|
|
1074
|
+
*
|
|
1075
|
+
* @returns {string} 结果文本
|
|
1076
|
+
*/;
|
|
1077
|
+
_proto.fnCAPITALIZE = function fnCAPITALIZE(text) {
|
|
1078
|
+
text = this.normalizeText(text);
|
|
1079
|
+
return (0, _capitalize.default)(text);
|
|
1080
|
+
}
|
|
1081
|
+
/**
|
|
1082
|
+
* 对文本进行 HTML 转义
|
|
1083
|
+
*
|
|
1084
|
+
* 示例 `ESCAPE("<star>&")`
|
|
1085
|
+
*
|
|
1086
|
+
* 返回 `<start>&`
|
|
1087
|
+
*
|
|
1088
|
+
* @example ESCAPE(text)
|
|
1089
|
+
* @param {string} text - 文本
|
|
1090
|
+
* @namespace 文本函数
|
|
1091
|
+
*
|
|
1092
|
+
* @returns {string} 结果文本
|
|
1093
|
+
*/;
|
|
1094
|
+
_proto.fnESCAPE = function fnESCAPE(text) {
|
|
1095
|
+
text = this.normalizeText(text);
|
|
1096
|
+
return (0, _escape.default)(text);
|
|
1097
|
+
}
|
|
1098
|
+
/**
|
|
1099
|
+
* 对文本长度进行截断
|
|
1100
|
+
*
|
|
1101
|
+
* 示例 `TRUNCATE("amis.baidu.com", 6)`
|
|
1102
|
+
*
|
|
1103
|
+
* 返回 `amis...`
|
|
1104
|
+
*
|
|
1105
|
+
* @example TRUNCATE(text, 6)
|
|
1106
|
+
* @param {string} text - 文本
|
|
1107
|
+
* @param {number} text - 最长长度
|
|
1108
|
+
* @namespace 文本函数
|
|
1109
|
+
*
|
|
1110
|
+
* @returns {string} 结果文本
|
|
1111
|
+
*/;
|
|
1112
|
+
_proto.fnTRUNCATE = function fnTRUNCATE(text, length) {
|
|
1113
|
+
text = this.normalizeText(text);
|
|
1114
|
+
return (0, _truncate.default)(text, {
|
|
1115
|
+
length: length
|
|
1116
|
+
});
|
|
1117
|
+
}
|
|
1118
|
+
/**
|
|
1119
|
+
* 取在某个分隔符之前的所有字符串
|
|
1120
|
+
*
|
|
1121
|
+
* @example BEFORELAST(text, '.')
|
|
1122
|
+
* @param {string} text - 文本
|
|
1123
|
+
* @param {string} delimiter - 结束文本
|
|
1124
|
+
* @namespace 文本函数
|
|
1125
|
+
*
|
|
1126
|
+
* @returns {string} 判断结果
|
|
1127
|
+
*/;
|
|
1128
|
+
_proto.fnBEFORELAST = function fnBEFORELAST(text, delimiter) {
|
|
1129
|
+
if (delimiter === void 0) {
|
|
1130
|
+
delimiter = '.';
|
|
1131
|
+
}
|
|
1132
|
+
text = this.normalizeText(text);
|
|
1133
|
+
return text.split(delimiter).slice(0, -1).join(delimiter) || text + '';
|
|
1134
|
+
}
|
|
1135
|
+
/**
|
|
1136
|
+
* 将文本根据指定片段分割成数组
|
|
1137
|
+
*
|
|
1138
|
+
* 示例:`SPLIT("a,b,c", ",")`
|
|
1139
|
+
*
|
|
1140
|
+
* 返回 `["a", "b", "c"]`
|
|
1141
|
+
*
|
|
1142
|
+
* @example SPLIT(text, ',')
|
|
1143
|
+
* @param {string} text - 文本
|
|
1144
|
+
* @param {string} delimiter - 文本片段
|
|
1145
|
+
* @namespace 文本函数
|
|
1146
|
+
*
|
|
1147
|
+
* @returns {Array<string>} 文本集
|
|
1148
|
+
*/;
|
|
1149
|
+
_proto.fnSPLIT = function fnSPLIT(text, sep) {
|
|
1150
|
+
if (sep === void 0) {
|
|
1151
|
+
sep = ',';
|
|
1152
|
+
}
|
|
1153
|
+
text = this.normalizeText(text);
|
|
1154
|
+
return text.split(sep);
|
|
1155
|
+
}
|
|
1156
|
+
/**
|
|
1157
|
+
* 将文本去除前后空格
|
|
1158
|
+
*
|
|
1159
|
+
* @example TRIM(text)
|
|
1160
|
+
* @param {string} text - 文本
|
|
1161
|
+
* @namespace 文本函数
|
|
1162
|
+
*
|
|
1163
|
+
* @returns {string} 处理后的文本
|
|
1164
|
+
*/;
|
|
1165
|
+
_proto.fnTRIM = function fnTRIM(text) {
|
|
1166
|
+
text = this.normalizeText(text);
|
|
1167
|
+
return text.trim();
|
|
1168
|
+
}
|
|
1169
|
+
/**
|
|
1170
|
+
* 去除文本中的 HTML 标签
|
|
1171
|
+
*
|
|
1172
|
+
* 示例:`STRIPTAG("<b>amis</b>")`
|
|
1173
|
+
*
|
|
1174
|
+
* 返回:`amis`
|
|
1175
|
+
*
|
|
1176
|
+
* @example STRIPTAG(text)
|
|
1177
|
+
* @param {string} text - 文本
|
|
1178
|
+
* @namespace 文本函数
|
|
1179
|
+
*
|
|
1180
|
+
* @returns {string} 处理后的文本
|
|
1181
|
+
*/;
|
|
1182
|
+
_proto.fnSTRIPTAG = function fnSTRIPTAG(text) {
|
|
1183
|
+
text = this.normalizeText(text);
|
|
1184
|
+
return text.replace(/<\/?[^>]+(>|$)/g, '');
|
|
1185
|
+
}
|
|
1186
|
+
/**
|
|
1187
|
+
* 将字符串中的换行转成 HTML `<br>`,用于简单换行的场景
|
|
1188
|
+
*
|
|
1189
|
+
* 示例:`LINEBREAK("\n")`
|
|
1190
|
+
*
|
|
1191
|
+
* 返回:`<br/>`
|
|
1192
|
+
*
|
|
1193
|
+
* @example LINEBREAK(text)
|
|
1194
|
+
* @param {string} text - 文本
|
|
1195
|
+
* @namespace 文本函数
|
|
1196
|
+
*
|
|
1197
|
+
* @returns {string} 处理后的文本
|
|
1198
|
+
*/;
|
|
1199
|
+
_proto.fnLINEBREAK = function fnLINEBREAK(text) {
|
|
1200
|
+
text = this.normalizeText(text);
|
|
1201
|
+
return text.replace(/(?:\r\n|\r|\n)/g, '<br/>');
|
|
1202
|
+
}
|
|
1203
|
+
/**
|
|
1204
|
+
* 判断字符串(text)是否以特定字符串(startString)开始,是则返回 True,否则返回 False
|
|
1205
|
+
*
|
|
1206
|
+
* @example STARTSWITH(text, '片段')
|
|
1207
|
+
* @param {string} text - 文本
|
|
1208
|
+
* @param {string} startString - 起始文本
|
|
1209
|
+
* @namespace 文本函数
|
|
1210
|
+
*
|
|
1211
|
+
* @returns {string} 判断结果
|
|
1212
|
+
*/;
|
|
1213
|
+
_proto.fnSTARTSWITH = function fnSTARTSWITH(text, search) {
|
|
1214
|
+
if (!search) {
|
|
1215
|
+
return false;
|
|
1216
|
+
}
|
|
1217
|
+
text = this.normalizeText(text);
|
|
1218
|
+
return text.indexOf(search) === 0;
|
|
1219
|
+
}
|
|
1220
|
+
/**
|
|
1221
|
+
* 判断字符串(text)是否以特定字符串(endString)结束,是则返回 True,否则返回 False
|
|
1222
|
+
*
|
|
1223
|
+
* @example ENDSWITH(text, '片段')
|
|
1224
|
+
* @param {string} text - 文本
|
|
1225
|
+
* @param {string} endString - 结束文本
|
|
1226
|
+
* @namespace 文本函数
|
|
1227
|
+
*
|
|
1228
|
+
* @returns {string} 判断结果
|
|
1229
|
+
*/;
|
|
1230
|
+
_proto.fnENDSWITH = function fnENDSWITH(text, search) {
|
|
1231
|
+
if (!search) {
|
|
1232
|
+
return false;
|
|
1233
|
+
}
|
|
1234
|
+
text = this.normalizeText(text);
|
|
1235
|
+
return text.indexOf(search, text.length - search.length) !== -1;
|
|
1236
|
+
}
|
|
1237
|
+
/**
|
|
1238
|
+
* 判断参数 1 中的文本是否包含参数 2 中的文本。
|
|
1239
|
+
*
|
|
1240
|
+
* @example CONTAINS(text, searchText)
|
|
1241
|
+
* @param {string} text - 文本
|
|
1242
|
+
* @param {string} searchText - 搜索文本
|
|
1243
|
+
* @namespace 文本函数
|
|
1244
|
+
*
|
|
1245
|
+
* @returns {string} 判断结果
|
|
1246
|
+
*/;
|
|
1247
|
+
_proto.fnCONTAINS = function fnCONTAINS(text, search) {
|
|
1248
|
+
if (!search) {
|
|
1249
|
+
return false;
|
|
1250
|
+
}
|
|
1251
|
+
text = this.normalizeText(text);
|
|
1252
|
+
return !!~text.indexOf(search);
|
|
1253
|
+
}
|
|
1254
|
+
/**
|
|
1255
|
+
* 对文本进行全量替换。
|
|
1256
|
+
*
|
|
1257
|
+
* @example REPLACE(text, search, replace)
|
|
1258
|
+
* @param {string} text - 要处理的文本
|
|
1259
|
+
* @param {string} search - 要被替换的文本
|
|
1260
|
+
* @param {string} replace - 要替换的文本
|
|
1261
|
+
* @namespace 文本函数
|
|
1262
|
+
*
|
|
1263
|
+
* @returns {string} 处理结果
|
|
1264
|
+
*/;
|
|
1265
|
+
_proto.fnREPLACE = function fnREPLACE(text, search, replace) {
|
|
1266
|
+
text = this.normalizeText(text);
|
|
1267
|
+
var result = text;
|
|
1268
|
+
while (true) {
|
|
1269
|
+
var idx = result.indexOf(search);
|
|
1270
|
+
if (!~idx) {
|
|
1271
|
+
break;
|
|
1272
|
+
}
|
|
1273
|
+
result = result.substring(0, idx) + replace + result.substring(idx + search.length);
|
|
1274
|
+
}
|
|
1275
|
+
return result;
|
|
1276
|
+
}
|
|
1277
|
+
/**
|
|
1278
|
+
* 对文本进行搜索,返回命中的位置
|
|
1279
|
+
*
|
|
1280
|
+
* @example SEARCH(text, search, 0)
|
|
1281
|
+
* @param {string} text - 要处理的文本
|
|
1282
|
+
* @param {string} search - 用来搜索的文本
|
|
1283
|
+
* @param {number} start - 起始位置
|
|
1284
|
+
* @namespace 文本函数
|
|
1285
|
+
*
|
|
1286
|
+
* @returns {number} 命中的位置
|
|
1287
|
+
*/;
|
|
1288
|
+
_proto.fnSEARCH = function fnSEARCH(text, search, start) {
|
|
1289
|
+
if (start === void 0) {
|
|
1290
|
+
start = 0;
|
|
1291
|
+
}
|
|
1292
|
+
text = this.normalizeText(text);
|
|
1293
|
+
start = this.formatNumber(start);
|
|
1294
|
+
var idx = text.indexOf(search, start);
|
|
1295
|
+
if (~idx) {
|
|
1296
|
+
return idx;
|
|
1297
|
+
}
|
|
1298
|
+
return -1;
|
|
1299
|
+
}
|
|
1300
|
+
/**
|
|
1301
|
+
* 返回文本字符串中从指定位置开始的特定数目的字符
|
|
1302
|
+
*
|
|
1303
|
+
* @example MID(text, from, len)
|
|
1304
|
+
* @param {string} text - 要处理的文本
|
|
1305
|
+
* @param {number} from - 起始位置
|
|
1306
|
+
* @param {number} len - 处理长度
|
|
1307
|
+
* @namespace 文本函数
|
|
1308
|
+
*
|
|
1309
|
+
* @returns {number} 命中的位置
|
|
1310
|
+
*/;
|
|
1311
|
+
_proto.fnMID = function fnMID(text, from, len) {
|
|
1312
|
+
text = this.normalizeText(text);
|
|
1313
|
+
return text.substring(from, from + len);
|
|
1314
|
+
}
|
|
1315
|
+
/**
|
|
1316
|
+
* 返回路径中的文件名
|
|
1317
|
+
*
|
|
1318
|
+
* 示例:`/home/amis/a.json`
|
|
1319
|
+
*
|
|
1320
|
+
* 返回:a.json`
|
|
1321
|
+
*
|
|
1322
|
+
* @example BASENAME(text)
|
|
1323
|
+
* @param {string} text - 要处理的文本
|
|
1324
|
+
* @namespace 文本函数
|
|
1325
|
+
*
|
|
1326
|
+
* @returns {string} 文件名
|
|
1327
|
+
*/;
|
|
1328
|
+
_proto.fnBASENAME = function fnBASENAME(text) {
|
|
1329
|
+
text = this.normalizeText(text);
|
|
1330
|
+
return text.split(/[\\/]/).pop();
|
|
1331
|
+
}
|
|
1332
|
+
// 日期函数
|
|
1333
|
+
/**
|
|
1334
|
+
* 创建日期对象,可以通过特定格式的字符串,或者数值。
|
|
1335
|
+
*
|
|
1336
|
+
* 需要注意的是,其中月份的数值是从0开始的,也就是说,
|
|
1337
|
+
* 如果是12月份,你应该传入数值11。
|
|
1338
|
+
*
|
|
1339
|
+
* @example DATE(2021, 11, 6, 8, 20, 0)
|
|
1340
|
+
* @example DATE('2021-12-06 08:20:00')
|
|
1341
|
+
* @namespace 日期函数
|
|
1342
|
+
*
|
|
1343
|
+
* @returns {Date} 日期对象
|
|
1344
|
+
*/;
|
|
1345
|
+
_proto.fnDATE = function fnDATE(year, month, day, hour, minute, second) {
|
|
1346
|
+
if (month === undefined) {
|
|
1347
|
+
return new Date(year);
|
|
1348
|
+
}
|
|
1349
|
+
return new Date(year, month, day, hour, minute, second);
|
|
1350
|
+
}
|
|
1351
|
+
/**
|
|
1352
|
+
* 返回时间的时间戳
|
|
1353
|
+
*
|
|
1354
|
+
* @example TIMESTAMP(date[, format = "X"])
|
|
1355
|
+
* @example TIMESTAMP(date, 'x')
|
|
1356
|
+
* @namespace 日期函数
|
|
1357
|
+
* @param {date} date 日期对象
|
|
1358
|
+
* @param {string} format 时间戳格式,带毫秒传入 'x'。默认为 'X' 不带毫秒的。
|
|
1359
|
+
*
|
|
1360
|
+
* @returns {number} 时间戳
|
|
1361
|
+
*/;
|
|
1362
|
+
_proto.fnTIMESTAMP = function fnTIMESTAMP(date, format) {
|
|
1363
|
+
return parseInt((0, _moment.default)(date).format(format === 'x' ? 'x' : 'X'), 10);
|
|
1364
|
+
}
|
|
1365
|
+
/**
|
|
1366
|
+
* 返回今天的日期
|
|
1367
|
+
*
|
|
1368
|
+
* @example TODAY()
|
|
1369
|
+
* @namespace 日期函数
|
|
1370
|
+
*
|
|
1371
|
+
* @returns {number} 日期
|
|
1372
|
+
*/;
|
|
1373
|
+
_proto.fnTODAY = function fnTODAY() {
|
|
1374
|
+
return new Date();
|
|
1375
|
+
}
|
|
1376
|
+
/**
|
|
1377
|
+
* 返回现在的日期
|
|
1378
|
+
*
|
|
1379
|
+
* @example NOW()
|
|
1380
|
+
* @namespace 日期函数
|
|
1381
|
+
*
|
|
1382
|
+
* @returns {number} 日期
|
|
1383
|
+
*/;
|
|
1384
|
+
_proto.fnNOW = function fnNOW() {
|
|
1385
|
+
return new Date();
|
|
1386
|
+
}
|
|
1387
|
+
/**
|
|
1388
|
+
* 将日期转成日期字符串
|
|
1389
|
+
*
|
|
1390
|
+
* @example DATETOSTR(date[, format="YYYY-MM-DD HH:mm:ss"])
|
|
1391
|
+
* @example DATETOSTR(date, 'YYYY-MM-DD')
|
|
1392
|
+
* @namespace 日期函数
|
|
1393
|
+
* @param {date} date 日期对象
|
|
1394
|
+
* @param {string} format 日期格式,默认为 "YYYY-MM-DD HH:mm:ss"
|
|
1395
|
+
*
|
|
1396
|
+
* @returns {number} 日期字符串
|
|
1397
|
+
*/;
|
|
1398
|
+
_proto.fnDATETOSTR = function fnDATETOSTR(date, format) {
|
|
1399
|
+
if (format === void 0) {
|
|
1400
|
+
format = 'YYYY-MM-DD HH:mm:ss';
|
|
1401
|
+
}
|
|
1402
|
+
return (0, _moment.default)(date).format(format);
|
|
1403
|
+
}
|
|
1404
|
+
/**
|
|
1405
|
+
* 返回日期的指定范围的开端
|
|
1406
|
+
*
|
|
1407
|
+
* @namespace 日期函数
|
|
1408
|
+
* @example STARTOF(date[unit = "day"])
|
|
1409
|
+
* @param {date} date 日期对象
|
|
1410
|
+
* @param {string} unit 比如可以传入 'day'、'month'、'year' 或者 `week` 等等
|
|
1411
|
+
* @returns {date} 新的日期对象
|
|
1412
|
+
*/;
|
|
1413
|
+
_proto.fnSTARTOF = function fnSTARTOF(date, unit) {
|
|
1414
|
+
return (0, _moment.default)(date).startOf(unit || 'day').toDate();
|
|
1415
|
+
}
|
|
1416
|
+
/**
|
|
1417
|
+
* 返回日期的指定范围的末尾
|
|
1418
|
+
* @namespace 日期函数
|
|
1419
|
+
* @example ENDOF(date[unit = "day"])
|
|
1420
|
+
* @param {date} date 日期对象
|
|
1421
|
+
* @param {string} unit 比如可以传入 'day'、'month'、'year' 或者 `week` 等等
|
|
1422
|
+
* @returns {date} 新的日期对象
|
|
1423
|
+
*/;
|
|
1424
|
+
_proto.fnENDOF = function fnENDOF(date, unit) {
|
|
1425
|
+
return (0, _moment.default)(date).endOf(unit || 'day').toDate();
|
|
1426
|
+
};
|
|
1427
|
+
_proto.normalizeDate = function normalizeDate(raw) {
|
|
1428
|
+
if (typeof raw === 'number' || !isNaN(raw)) {
|
|
1429
|
+
return new Date(Number(raw));
|
|
1430
|
+
}
|
|
1431
|
+
if (typeof raw === 'string') {
|
|
1432
|
+
var formats = ['', 'YYYY-MM-DD HH:mm:ss', 'X'];
|
|
1433
|
+
while (formats.length) {
|
|
1434
|
+
var format = formats.shift();
|
|
1435
|
+
var date = (0, _moment.default)(raw, format);
|
|
1436
|
+
if (date.isValid()) {
|
|
1437
|
+
return date.toDate();
|
|
1438
|
+
}
|
|
1439
|
+
}
|
|
1440
|
+
}
|
|
1441
|
+
return raw;
|
|
1442
|
+
}
|
|
1443
|
+
/**
|
|
1444
|
+
* 返回日期的年份
|
|
1445
|
+
* @namespace 日期函数
|
|
1446
|
+
* @example YEAR(date)
|
|
1447
|
+
* @param {date} date 日期对象
|
|
1448
|
+
* @returns {number} 数值
|
|
1449
|
+
*/;
|
|
1450
|
+
_proto.fnYEAR = function fnYEAR(date) {
|
|
1451
|
+
date = this.normalizeDate(date);
|
|
1452
|
+
return date.getFullYear();
|
|
1453
|
+
}
|
|
1454
|
+
/**
|
|
1455
|
+
* 返回日期的月份,这里就是自然月份。
|
|
1456
|
+
*
|
|
1457
|
+
* @namespace 日期函数
|
|
1458
|
+
* @example MONTH(date)
|
|
1459
|
+
* @param {date} date 日期对象
|
|
1460
|
+
* @returns {number} 数值
|
|
1461
|
+
*/;
|
|
1462
|
+
_proto.fnMONTH = function fnMONTH(date) {
|
|
1463
|
+
date = this.normalizeDate(date);
|
|
1464
|
+
return date.getMonth() + 1;
|
|
1465
|
+
}
|
|
1466
|
+
/**
|
|
1467
|
+
* 返回日期的天
|
|
1468
|
+
* @namespace 日期函数
|
|
1469
|
+
* @example DAY(date)
|
|
1470
|
+
* @param {date} date 日期对象
|
|
1471
|
+
* @returns {number} 数值
|
|
1472
|
+
*/;
|
|
1473
|
+
_proto.fnDAY = function fnDAY(date) {
|
|
1474
|
+
date = this.normalizeDate(date);
|
|
1475
|
+
return date.getDate();
|
|
1476
|
+
}
|
|
1477
|
+
/**
|
|
1478
|
+
* 返回日期的小时
|
|
1479
|
+
* @param {date} date 日期对象
|
|
1480
|
+
* @namespace 日期函数
|
|
1481
|
+
* @example HOUR(date)
|
|
1482
|
+
* @returns {number} 数值
|
|
1483
|
+
*/;
|
|
1484
|
+
_proto.fnHOUR = function fnHOUR(date) {
|
|
1485
|
+
date = this.normalizeDate(date);
|
|
1486
|
+
return date.getHours();
|
|
1487
|
+
}
|
|
1488
|
+
/**
|
|
1489
|
+
* 返回日期的分
|
|
1490
|
+
* @param {date} date 日期对象
|
|
1491
|
+
* @namespace 日期函数
|
|
1492
|
+
* @example MINUTE(date)
|
|
1493
|
+
* @returns {number} 数值
|
|
1494
|
+
*/;
|
|
1495
|
+
_proto.fnMINUTE = function fnMINUTE(date) {
|
|
1496
|
+
date = this.normalizeDate(date);
|
|
1497
|
+
return date.getMinutes();
|
|
1498
|
+
}
|
|
1499
|
+
/**
|
|
1500
|
+
* 返回日期的秒
|
|
1501
|
+
* @param {date} date 日期对象
|
|
1502
|
+
* @namespace 日期函数
|
|
1503
|
+
* @example SECOND(date)
|
|
1504
|
+
* @returns {number} 数值
|
|
1505
|
+
*/;
|
|
1506
|
+
_proto.fnSECOND = function fnSECOND(date) {
|
|
1507
|
+
date = this.normalizeDate(date);
|
|
1508
|
+
return date.getSeconds();
|
|
1509
|
+
}
|
|
1510
|
+
/**
|
|
1511
|
+
* 返回两个日期相差多少年
|
|
1512
|
+
* @param {date} endDate 日期对象
|
|
1513
|
+
* @param {date} startDate 日期对象
|
|
1514
|
+
* @namespace 日期函数
|
|
1515
|
+
* @example YEARS(endDate, startDate)
|
|
1516
|
+
* @returns {number} 数值
|
|
1517
|
+
*/;
|
|
1518
|
+
_proto.fnYEARS = function fnYEARS(endDate, startDate) {
|
|
1519
|
+
endDate = this.normalizeDate(endDate);
|
|
1520
|
+
startDate = this.normalizeDate(startDate);
|
|
1521
|
+
return (0, _moment.default)(endDate).diff((0, _moment.default)(startDate), 'year');
|
|
1522
|
+
}
|
|
1523
|
+
/**
|
|
1524
|
+
* 返回两个日期相差多少分钟
|
|
1525
|
+
* @param {date} endDate 日期对象
|
|
1526
|
+
* @param {date} startDate 日期对象
|
|
1527
|
+
* @namespace 日期函数
|
|
1528
|
+
* @example MINUTES(endDate, startDate)
|
|
1529
|
+
* @returns {number} 数值
|
|
1530
|
+
*/;
|
|
1531
|
+
_proto.fnMINUTES = function fnMINUTES(endDate, startDate) {
|
|
1532
|
+
endDate = this.normalizeDate(endDate);
|
|
1533
|
+
startDate = this.normalizeDate(startDate);
|
|
1534
|
+
return (0, _moment.default)(endDate).diff((0, _moment.default)(startDate), 'minutes');
|
|
1535
|
+
}
|
|
1536
|
+
/**
|
|
1537
|
+
* 返回两个日期相差多少天
|
|
1538
|
+
* @param {date} endDate 日期对象
|
|
1539
|
+
* @param {date} startDate 日期对象
|
|
1540
|
+
* @namespace 日期函数
|
|
1541
|
+
* @example DAYS(endDate, startDate)
|
|
1542
|
+
* @returns {number} 数值
|
|
1543
|
+
*/;
|
|
1544
|
+
_proto.fnDAYS = function fnDAYS(endDate, startDate) {
|
|
1545
|
+
endDate = this.normalizeDate(endDate);
|
|
1546
|
+
startDate = this.normalizeDate(startDate);
|
|
1547
|
+
return (0, _moment.default)(endDate).diff((0, _moment.default)(startDate), 'days');
|
|
1548
|
+
}
|
|
1549
|
+
/**
|
|
1550
|
+
* 返回两个日期相差多少小时
|
|
1551
|
+
* @param {date} endDate 日期对象
|
|
1552
|
+
* @param {date} startDate 日期对象
|
|
1553
|
+
* @namespace 日期函数
|
|
1554
|
+
* @example HOURS(endDate, startDate)
|
|
1555
|
+
* @returns {number} 数值
|
|
1556
|
+
*/;
|
|
1557
|
+
_proto.fnHOURS = function fnHOURS(endDate, startDate) {
|
|
1558
|
+
endDate = this.normalizeDate(endDate);
|
|
1559
|
+
startDate = this.normalizeDate(startDate);
|
|
1560
|
+
return (0, _moment.default)(endDate).diff((0, _moment.default)(startDate), 'hour');
|
|
1561
|
+
}
|
|
1562
|
+
/**
|
|
1563
|
+
* 修改日期,对日期进行加减天、月份、年等操作
|
|
1564
|
+
*
|
|
1565
|
+
* 示例:
|
|
1566
|
+
*
|
|
1567
|
+
* DATEMODIFY(A, -2, 'month')
|
|
1568
|
+
*
|
|
1569
|
+
* 对日期 A 进行往前减2月的操作。
|
|
1570
|
+
*
|
|
1571
|
+
* @param {date} date 日期对象
|
|
1572
|
+
* @param {number} num 数值
|
|
1573
|
+
* @param {string} unit 单位:支持年、月、天等等
|
|
1574
|
+
* @namespace 日期函数
|
|
1575
|
+
* @example DATEMODIFY(date, 2, 'days')
|
|
1576
|
+
* @returns {date} 日期对象
|
|
1577
|
+
*/;
|
|
1578
|
+
_proto.fnDATEMODIFY = function fnDATEMODIFY(date, num, format) {
|
|
1579
|
+
date = this.normalizeDate(date);
|
|
1580
|
+
return (0, _moment.default)(date).add(num, format).toDate();
|
|
1581
|
+
}
|
|
1582
|
+
/**
|
|
1583
|
+
* 将字符日期转成日期对象,可以指定日期格式。
|
|
1584
|
+
*
|
|
1585
|
+
* 示例:STRTODATE('2021/12/6', 'YYYY/MM/DD')
|
|
1586
|
+
*
|
|
1587
|
+
* @param {string} value 日期字符
|
|
1588
|
+
* @param {string} format 日期格式
|
|
1589
|
+
* @namespace 日期函数
|
|
1590
|
+
* @example STRTODATE(value[, format=""])
|
|
1591
|
+
* @returns {date} 日期对象
|
|
1592
|
+
*/;
|
|
1593
|
+
_proto.fnSTRTODATE = function fnSTRTODATE(value, format) {
|
|
1594
|
+
if (format === void 0) {
|
|
1595
|
+
format = '';
|
|
1596
|
+
}
|
|
1597
|
+
return (0, _moment.default)(value, format).toDate();
|
|
1598
|
+
}
|
|
1599
|
+
/**
|
|
1600
|
+
* 判断两个日期,是否第一个日期在第二个日期的前面
|
|
1601
|
+
*
|
|
1602
|
+
* @param {date} a 第一个日期
|
|
1603
|
+
* @param {date} b 第二个日期
|
|
1604
|
+
* @param {string} unit 单位,默认是 'day', 即之比较到天
|
|
1605
|
+
* @namespace 日期函数
|
|
1606
|
+
* @example ISBEFORE(a, b)
|
|
1607
|
+
* @returns {boolean} 判断结果
|
|
1608
|
+
*/;
|
|
1609
|
+
_proto.fnISBEFORE = function fnISBEFORE(a, b, unit) {
|
|
1610
|
+
if (unit === void 0) {
|
|
1611
|
+
unit = 'day';
|
|
1612
|
+
}
|
|
1613
|
+
a = this.normalizeDate(a);
|
|
1614
|
+
b = this.normalizeDate(b);
|
|
1615
|
+
return (0, _moment.default)(a).isBefore((0, _moment.default)(b), unit);
|
|
1616
|
+
}
|
|
1617
|
+
/**
|
|
1618
|
+
* 判断两个日期,是否第一个日期在第二个日期的后面
|
|
1619
|
+
*
|
|
1620
|
+
* @param {date} a 第一个日期
|
|
1621
|
+
* @param {date} b 第二个日期
|
|
1622
|
+
* @param {string} unit 单位,默认是 'day', 即之比较到天
|
|
1623
|
+
* @namespace 日期函数
|
|
1624
|
+
* @example ISAFTER(a, b)
|
|
1625
|
+
* @returns {boolean} 判断结果
|
|
1626
|
+
*/;
|
|
1627
|
+
_proto.fnISAFTER = function fnISAFTER(a, b, unit) {
|
|
1628
|
+
if (unit === void 0) {
|
|
1629
|
+
unit = 'day';
|
|
1630
|
+
}
|
|
1631
|
+
a = this.normalizeDate(a);
|
|
1632
|
+
b = this.normalizeDate(b);
|
|
1633
|
+
return (0, _moment.default)(a).isAfter((0, _moment.default)(b), unit);
|
|
1634
|
+
}
|
|
1635
|
+
/**
|
|
1636
|
+
* 判断两个日期,是否第一个日期在第二个日期的前面或者相等
|
|
1637
|
+
*
|
|
1638
|
+
* @param {date} a 第一个日期
|
|
1639
|
+
* @param {date} b 第二个日期
|
|
1640
|
+
* @param {string} unit 单位,默认是 'day', 即之比较到天
|
|
1641
|
+
* @namespace 日期函数
|
|
1642
|
+
* @example ISSAMEORBEFORE(a, b)
|
|
1643
|
+
* @returns {boolean} 判断结果
|
|
1644
|
+
*/;
|
|
1645
|
+
_proto.fnISSAMEORBEFORE = function fnISSAMEORBEFORE(a, b, unit) {
|
|
1646
|
+
if (unit === void 0) {
|
|
1647
|
+
unit = 'day';
|
|
1648
|
+
}
|
|
1649
|
+
a = this.normalizeDate(a);
|
|
1650
|
+
b = this.normalizeDate(b);
|
|
1651
|
+
return (0, _moment.default)(a).isSameOrBefore((0, _moment.default)(b), unit);
|
|
1652
|
+
}
|
|
1653
|
+
/**
|
|
1654
|
+
* 判断两个日期,是否第一个日期在第二个日期的后面或者相等
|
|
1655
|
+
*
|
|
1656
|
+
* @param {date} a 第一个日期
|
|
1657
|
+
* @param {date} b 第二个日期
|
|
1658
|
+
* @param {string} unit 单位,默认是 'day', 即之比较到天
|
|
1659
|
+
* @namespace 日期函数
|
|
1660
|
+
* @example ISSAMEORAFTER(a, b)
|
|
1661
|
+
* @returns {boolean} 判断结果
|
|
1662
|
+
*/;
|
|
1663
|
+
_proto.fnISSAMEORAFTER = function fnISSAMEORAFTER(a, b, unit) {
|
|
1664
|
+
if (unit === void 0) {
|
|
1665
|
+
unit = 'day';
|
|
1666
|
+
}
|
|
1667
|
+
a = this.normalizeDate(a);
|
|
1668
|
+
b = this.normalizeDate(b);
|
|
1669
|
+
return (0, _moment.default)(a).isSameOrAfter((0, _moment.default)(b), unit);
|
|
1670
|
+
}
|
|
1671
|
+
/**
|
|
1672
|
+
* 返回数组的长度
|
|
1673
|
+
*
|
|
1674
|
+
* @param {Array<any>} arr 数组
|
|
1675
|
+
* @namespace 数组
|
|
1676
|
+
* @example COUNT(arr)
|
|
1677
|
+
* @returns {boolean} 结果
|
|
1678
|
+
*/;
|
|
1679
|
+
_proto.fnCOUNT = function fnCOUNT(value) {
|
|
1680
|
+
return Array.isArray(value) ? value.length : value ? 1 : 0;
|
|
1681
|
+
}
|
|
1682
|
+
/**
|
|
1683
|
+
* 数组做数据转换,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
|
|
1684
|
+
*
|
|
1685
|
+
* @param {Array<any>} arr 数组
|
|
1686
|
+
* @param {Function<any>} iterator 箭头函数
|
|
1687
|
+
* @namespace 数组
|
|
1688
|
+
* @example ARRAYMAP(arr, item => item)
|
|
1689
|
+
* @returns {boolean} 结果
|
|
1690
|
+
*/;
|
|
1691
|
+
_proto.fnARRAYMAP = function fnARRAYMAP(value, iterator) {
|
|
1692
|
+
var _this16 = this;
|
|
1693
|
+
if (!iterator || iterator.type !== 'anonymous_function') {
|
|
1694
|
+
throw new Error('expected an anonymous function get ' + iterator);
|
|
1695
|
+
}
|
|
1696
|
+
return (Array.isArray(value) ? value : []).map(function (item, index, arr) {
|
|
1697
|
+
return _this16.callAnonymousFunction(iterator, [item, index, arr]);
|
|
1698
|
+
});
|
|
1699
|
+
}
|
|
1700
|
+
/**
|
|
1701
|
+
* 数据做数据过滤,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
|
|
1702
|
+
* 将第二个箭头函数返回为 false 的成员过滤掉。
|
|
1703
|
+
*
|
|
1704
|
+
* @param {Array<any>} arr 数组
|
|
1705
|
+
* @param {Function<any>} iterator 箭头函数
|
|
1706
|
+
* @namespace 数组
|
|
1707
|
+
* @example ARRAYFILTER(arr, item => item)
|
|
1708
|
+
* @returns {boolean} 结果
|
|
1709
|
+
*/;
|
|
1710
|
+
_proto.fnARRAYFILTER = function fnARRAYFILTER(value, iterator) {
|
|
1711
|
+
var _this17 = this;
|
|
1712
|
+
if (!iterator || iterator.type !== 'anonymous_function') {
|
|
1713
|
+
throw new Error('expected an anonymous function get ' + iterator);
|
|
1714
|
+
}
|
|
1715
|
+
return (Array.isArray(value) ? value : []).filter(function (item, index, arr) {
|
|
1716
|
+
return _this17.callAnonymousFunction(iterator, [item, index, arr]);
|
|
1717
|
+
});
|
|
1718
|
+
}
|
|
1719
|
+
/**
|
|
1720
|
+
* 数组过滤掉 false、null、0 和 ""
|
|
1721
|
+
*
|
|
1722
|
+
* 示例:
|
|
1723
|
+
*
|
|
1724
|
+
* COMPACT([0, 1, false, 2, '', 3]) 得到 [1, 2, 3]
|
|
1725
|
+
*
|
|
1726
|
+
* @param {Array<any>} arr 数组
|
|
1727
|
+
* @namespace 数组
|
|
1728
|
+
* @example COMPACT(arr)
|
|
1729
|
+
* @returns {Array<any>} 结果
|
|
1730
|
+
*/;
|
|
1731
|
+
_proto.fnCOMPACT = function fnCOMPACT(arr) {
|
|
1732
|
+
if (Array.isArray(arr)) {
|
|
1733
|
+
var resIndex = 0;
|
|
1734
|
+
var result = [];
|
|
1735
|
+
for (var _iterator4 = _createForOfIteratorHelperLoose(arr), _step4; !(_step4 = _iterator4()).done;) {
|
|
1736
|
+
var item = _step4.value;
|
|
1737
|
+
if (item) {
|
|
1738
|
+
result[resIndex++] = item;
|
|
1739
|
+
}
|
|
1740
|
+
}
|
|
1741
|
+
return result;
|
|
1742
|
+
} else {
|
|
1743
|
+
return [];
|
|
1744
|
+
}
|
|
1745
|
+
}
|
|
1746
|
+
/**
|
|
1747
|
+
* 数组转成字符串
|
|
1748
|
+
*
|
|
1749
|
+
* 示例:
|
|
1750
|
+
*
|
|
1751
|
+
* JOIN(['a', 'b', 'c'], '=') 得到 'a=b=c'
|
|
1752
|
+
*
|
|
1753
|
+
* @param {Array<any>} arr 数组
|
|
1754
|
+
* @param { String} separator 分隔符
|
|
1755
|
+
* @namespace 数组
|
|
1756
|
+
* @example JOIN(arr, string)
|
|
1757
|
+
* @returns {String} 结果
|
|
1758
|
+
*/;
|
|
1759
|
+
_proto.fnJOIN = function fnJOIN(arr, separator) {
|
|
1760
|
+
if (separator === void 0) {
|
|
1761
|
+
separator = '';
|
|
1762
|
+
}
|
|
1763
|
+
if (Array.isArray(arr)) {
|
|
1764
|
+
return arr.join(separator);
|
|
1765
|
+
} else {
|
|
1766
|
+
return '';
|
|
1767
|
+
}
|
|
1768
|
+
}
|
|
1769
|
+
/**
|
|
1770
|
+
* 数组合并
|
|
1771
|
+
*
|
|
1772
|
+
* 示例:
|
|
1773
|
+
*
|
|
1774
|
+
* CONCAT(['a', 'b', 'c'], ['1'], ['3']) 得到 ['a', 'b', 'c', '1', '3']
|
|
1775
|
+
*
|
|
1776
|
+
* @param {Array<any>} arr 数组
|
|
1777
|
+
* @namespace 数组
|
|
1778
|
+
* @example CONCAT(['a', 'b', 'c'], ['1'], ['3'])
|
|
1779
|
+
* @returns {Array<any>} 结果
|
|
1780
|
+
*/;
|
|
1781
|
+
_proto.fnCONCAT = function fnCONCAT() {
|
|
1782
|
+
for (var _len14 = arguments.length, arr = new Array(_len14), _key14 = 0; _key14 < _len14; _key14++) {
|
|
1783
|
+
arr[_key14] = arguments[_key14];
|
|
1784
|
+
}
|
|
1785
|
+
if ((arr === null || arr === void 0 ? void 0 : arr[0]) && !Array.isArray(arr[0])) {
|
|
1786
|
+
arr[0] = [arr[0]];
|
|
1787
|
+
}
|
|
1788
|
+
return arr.reduce(function (a, b) {
|
|
1789
|
+
return a.concat(b);
|
|
1790
|
+
}, []).filter(function (item) {
|
|
1791
|
+
return item;
|
|
1792
|
+
});
|
|
1793
|
+
}
|
|
1794
|
+
/**
|
|
1795
|
+
* 数组去重,第二个参数「field」,可指定根据该字段去重
|
|
1796
|
+
*
|
|
1797
|
+
* 示例:
|
|
1798
|
+
*
|
|
1799
|
+
* UNIQ([{a: '1'}, {b: '2'}, {a: '1'}], 'id')
|
|
1800
|
+
*
|
|
1801
|
+
* @param {Array<any>} arr 数组
|
|
1802
|
+
* @param {string} field 字段
|
|
1803
|
+
* @namespace 数组
|
|
1804
|
+
* @example UNIQ([{a: '1'}, {b: '2'}, {a: '1'}])
|
|
1805
|
+
* @example UNIQ([{a: '1'}, {b: '2'}, {a: '1'}], 'x')
|
|
1806
|
+
* @returns {Array<any>} 结果
|
|
1807
|
+
*/;
|
|
1808
|
+
_proto.fnUNIQ = function fnUNIQ(arr, field) {
|
|
1809
|
+
return field ? (0, _uniqBy.default)(arr, field) : (0, _uniqWith.default)(arr, _isEqual.default);
|
|
1810
|
+
}
|
|
1811
|
+
/**
|
|
1812
|
+
* 判断是否为类型支持:string, number, array, date, plain-object。
|
|
1813
|
+
*
|
|
1814
|
+
* @param {string} 判断对象
|
|
1815
|
+
* @namespace 其他
|
|
1816
|
+
* @example ISTYPE([{a: '1'}, {b: '2'}, {a: '1'}], 'array')
|
|
1817
|
+
* @returns {boolean} 结果结果
|
|
1818
|
+
*/;
|
|
1819
|
+
_proto.fnISTYPE = function fnISTYPE(target, type) {
|
|
1820
|
+
switch (type) {
|
|
1821
|
+
case 'string':
|
|
1822
|
+
return typeof target === 'string';
|
|
1823
|
+
case 'number':
|
|
1824
|
+
return typeof target === 'number';
|
|
1825
|
+
case 'array':
|
|
1826
|
+
return Array.isArray(target);
|
|
1827
|
+
case 'date':
|
|
1828
|
+
return !!(target && target instanceof Date);
|
|
1829
|
+
case 'plain-object':
|
|
1830
|
+
return (0, _isPlainObject.default)(target);
|
|
1831
|
+
case 'nil':
|
|
1832
|
+
return !target;
|
|
1833
|
+
}
|
|
1834
|
+
return false;
|
|
1835
|
+
};
|
|
1836
|
+
return Evaluator;
|
|
1837
|
+
}();
|
|
1838
|
+
exports.Evaluator = Evaluator;
|
|
1839
|
+
Evaluator.defaultFilters = {};
|
|
1840
|
+
Evaluator.defaultFunctions = {};
|
|
1841
|
+
function getCookie(name) {
|
|
1842
|
+
var value = "; " + document.cookie;
|
|
1843
|
+
var parts = value.split("; " + name + "=");
|
|
1844
|
+
if (parts.length === 2) {
|
|
1845
|
+
return parts.pop().split(';').shift();
|
|
1846
|
+
}
|
|
1847
|
+
return undefined;
|
|
1848
|
+
}
|
|
1849
|
+
function parseJson(str, defaultValue) {
|
|
1850
|
+
try {
|
|
1851
|
+
return JSON.parse(str);
|
|
1852
|
+
} catch (e) {
|
|
1853
|
+
return defaultValue;
|
|
1854
|
+
}
|
|
1855
|
+
}
|
|
1856
|
+
function stripNumber(number) {
|
|
1857
|
+
if (typeof number === 'number' && !Number.isInteger(number)) {
|
|
1858
|
+
return parseFloat(number.toPrecision(16));
|
|
1859
|
+
} else {
|
|
1860
|
+
return number;
|
|
1861
|
+
}
|
|
1862
|
+
}
|
|
1863
|
+
// 如果只有一个成员,同时第一个成员为 args
|
|
1864
|
+
// 则把它展开,当成是多个参数,毕竟公式里面还不支持 ...args 语法,
|
|
1865
|
+
function normalizeArgs(args) {
|
|
1866
|
+
if (args.length === 1 && Array.isArray(args[0])) {
|
|
1867
|
+
args = args[0];
|
|
1868
|
+
}
|
|
1869
|
+
return args;
|
|
1870
|
+
}
|
|
1871
|
+
function createObject(superProps, props, properties) {
|
|
1872
|
+
var obj = superProps ? Object.create(superProps, Object.assign(Object.assign({}, properties), {
|
|
1873
|
+
__super: {
|
|
1874
|
+
value: superProps,
|
|
1875
|
+
writable: false,
|
|
1876
|
+
enumerable: false
|
|
1877
|
+
}
|
|
1878
|
+
})) : Object.create(Object.prototype, properties);
|
|
1879
|
+
props && Object.keys(props).forEach(function (key) {
|
|
1880
|
+
return obj[key] = props[key];
|
|
1881
|
+
});
|
|
1882
|
+
return obj;
|
|
1883
|
+
}
|