amis-formula 1.3.12 → 1.3.15

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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # amis-tpl
1
+ # amis-formula
2
2
 
3
3
  负责 amis 里面的表达式、公式及模板的实现
4
4
 
package/dist/doc.js CHANGED
@@ -121,7 +121,7 @@ exports.doc = [
121
121
  },
122
122
  {
123
123
  name: "MAX",
124
- description: "获取最大值",
124
+ description: "获取最大值,如果只有一个参数且是数组,则计算这个数组内的值",
125
125
  example: "MAX(num1, num2, ...numN)",
126
126
  params: [
127
127
  {
@@ -138,7 +138,7 @@ exports.doc = [
138
138
  },
139
139
  {
140
140
  name: "MIN",
141
- description: "获取最小值",
141
+ description: "获取最小值,如果只有一个参数且是数组,则计算这个数组内的值",
142
142
  example: "MIN(num1, num2, ...numN)",
143
143
  params: [
144
144
  {
@@ -155,7 +155,7 @@ exports.doc = [
155
155
  },
156
156
  {
157
157
  name: "SUM",
158
- description: "求和",
158
+ description: "求和,如果只有一个参数且是数组,则计算这个数组内的值",
159
159
  example: "SUM(num1, num2, ...numN)",
160
160
  params: [
161
161
  {
@@ -305,7 +305,7 @@ exports.doc = [
305
305
  },
306
306
  {
307
307
  name: "AVG",
308
- description: "返回所有参数的平均值",
308
+ description: "返回所有参数的平均值,如果只有一个参数且是数组,则计算这个数组内的值",
309
309
  example: "AVG(num1, num2, ...numN)",
310
310
  params: [
311
311
  {
@@ -322,7 +322,7 @@ exports.doc = [
322
322
  },
323
323
  {
324
324
  name: "DEVSQ",
325
- description: "返回数据点与数据均值点之差(数据偏差)的平方和",
325
+ description: "返回数据点与数据均值点之差(数据偏差)的平方和,如果只有一个参数且是数组,则计算这个数组内的值",
326
326
  example: "DEVSQ(num1, num2, ...numN)",
327
327
  params: [
328
328
  {
@@ -356,7 +356,7 @@ exports.doc = [
356
356
  },
357
357
  {
358
358
  name: "HARMEAN",
359
- description: "数据点的调和平均值",
359
+ description: "数据点的调和平均值,如果只有一个参数且是数组,则计算这个数组内的值",
360
360
  example: "HARMEAN(num1, num2, ...numN)",
361
361
  params: [
362
362
  {
@@ -1443,7 +1443,7 @@ exports.doc = [
1443
1443
  type: "boolean",
1444
1444
  description: "结果"
1445
1445
  },
1446
- namespace: "其他"
1446
+ namespace: "数组"
1447
1447
  },
1448
1448
  {
1449
1449
  name: "ARRAYMAP",
@@ -1465,6 +1465,45 @@ exports.doc = [
1465
1465
  type: "boolean",
1466
1466
  description: "结果"
1467
1467
  },
1468
- namespace: "其他"
1468
+ namespace: "数组"
1469
+ },
1470
+ {
1471
+ name: "COMPACT",
1472
+ description: "数组过滤掉 false、null、0 和 \"\"\n\n示例:\n\nCOMPACT([0, 1, false, 2, '', 3]) 得到 [1, 2, 3]",
1473
+ example: "COMPACT(arr)",
1474
+ params: [
1475
+ {
1476
+ type: "Array<any>",
1477
+ name: "arr",
1478
+ description: "数组"
1479
+ }
1480
+ ],
1481
+ returns: {
1482
+ type: "Array<any>",
1483
+ description: "结果"
1484
+ },
1485
+ namespace: "数组"
1486
+ },
1487
+ {
1488
+ name: "JOIN",
1489
+ description: "数组转成字符串\n\n示例:\n\nJOIN(['a', 'b', 'c'], '~') 得到 'a~b~c'",
1490
+ example: "JOIN(arr, string)",
1491
+ params: [
1492
+ {
1493
+ type: "Array<any>",
1494
+ name: "arr",
1495
+ description: "数组"
1496
+ },
1497
+ {
1498
+ type: "String",
1499
+ name: "separator",
1500
+ description: "分隔符"
1501
+ }
1502
+ ],
1503
+ returns: {
1504
+ type: "String",
1505
+ description: "结果"
1506
+ },
1507
+ namespace: "数组"
1469
1508
  }
1470
1509
  ]
package/dist/doc.md CHANGED
@@ -93,7 +93,7 @@
93
93
 
94
94
  返回:`number` 所有传入值中最大的那个
95
95
 
96
- 获取最大值
96
+ 获取最大值,如果只有一个参数且是数组,则计算这个数组内的值
97
97
 
98
98
  ### MIN
99
99
 
@@ -103,7 +103,7 @@
103
103
 
104
104
  返回:`number` 所有传入值中最小的那个
105
105
 
106
- 获取最小值
106
+ 获取最小值,如果只有一个参数且是数组,则计算这个数组内的值
107
107
 
108
108
  ### SUM
109
109
 
@@ -113,7 +113,7 @@
113
113
 
114
114
  返回:`number` 所有传入数值的总和
115
115
 
116
- 求和
116
+ 求和,如果只有一个参数且是数组,则计算这个数组内的值
117
117
 
118
118
  ### INT
119
119
 
@@ -193,7 +193,7 @@
193
193
 
194
194
  返回:`number` 所有数值的平均值
195
195
 
196
- 返回所有参数的平均值
196
+ 返回所有参数的平均值,如果只有一个参数且是数组,则计算这个数组内的值
197
197
 
198
198
  ### DEVSQ
199
199
 
@@ -203,7 +203,7 @@
203
203
 
204
204
  返回:`number` 所有数值的平均值
205
205
 
206
- 返回数据点与数据均值点之差(数据偏差)的平方和
206
+ 返回数据点与数据均值点之差(数据偏差)的平方和,如果只有一个参数且是数组,则计算这个数组内的值
207
207
 
208
208
  ### AVEDEV
209
209
 
@@ -223,7 +223,7 @@
223
223
 
224
224
  返回:`number` 所有数值的平均值
225
225
 
226
- 数据点的调和平均值
226
+ 数据点的调和平均值,如果只有一个参数且是数组,则计算这个数组内的值
227
227
 
228
228
  ### LARGE
229
229
 
@@ -828,7 +828,7 @@ DATEMODIFY(A, -2, 'month')
828
828
 
829
829
  判断两个日期,是否第一个日期在第二个日期的后面或者相等
830
830
 
831
- ## 其他
831
+ ## 数组
832
832
 
833
833
  ### COUNT
834
834
 
@@ -851,3 +851,32 @@ DATEMODIFY(A, -2, 'month')
851
851
 
852
852
  数组做数据转换,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
853
853
 
854
+ ### COMPACT
855
+
856
+ 用法:`COMPACT(arr)`
857
+
858
+ * `arr:Array<any>` 数组
859
+
860
+ 返回:`Array<any>` 结果
861
+
862
+ 数组过滤掉 false、null、0 和 ""
863
+
864
+ 示例:
865
+
866
+ COMPACT([0, 1, false, 2, '', 3]) 得到 [1, 2, 3]
867
+
868
+ ### JOIN
869
+
870
+ 用法:`JOIN(arr, string)`
871
+
872
+ * `arr:Array<any>` 数组
873
+ * `separator:String` 分隔符
874
+
875
+ 返回:`String` 结果
876
+
877
+ 数组转成字符串
878
+
879
+ 示例:
880
+
881
+ JOIN(['a', 'b', 'c'], '~') 得到 'a~b~c'
882
+
@@ -288,7 +288,7 @@ export declare class Evaluator {
288
288
  */
289
289
  fnABS(a: number): number;
290
290
  /**
291
- * 获取最大值
291
+ * 获取最大值,如果只有一个参数且是数组,则计算这个数组内的值
292
292
  *
293
293
  * @example MAX(num1, num2, ...numN)
294
294
  * @param {...number} num - 数值
@@ -298,7 +298,7 @@ export declare class Evaluator {
298
298
  */
299
299
  fnMAX(...args: Array<any>): any;
300
300
  /**
301
- * 获取最小值
301
+ * 获取最小值,如果只有一个参数且是数组,则计算这个数组内的值
302
302
  *
303
303
  * @example MIN(num1, num2, ...numN)
304
304
  * @param {...number} num - 数值
@@ -308,7 +308,7 @@ export declare class Evaluator {
308
308
  */
309
309
  fnMIN(...args: Array<number>): any;
310
310
  /**
311
- * 求和
311
+ * 求和,如果只有一个参数且是数组,则计算这个数组内的值
312
312
  *
313
313
  * @example SUM(num1, num2, ...numN)
314
314
  * @param {...number} num - 数值
@@ -391,7 +391,7 @@ export declare class Evaluator {
391
391
  */
392
392
  fnSQRT(n: number): number;
393
393
  /**
394
- * 返回所有参数的平均值
394
+ * 返回所有参数的平均值,如果只有一个参数且是数组,则计算这个数组内的值
395
395
  *
396
396
  * @example AVG(num1, num2, ...numN)
397
397
  * @param {...number} num - 要处理的数字
@@ -401,7 +401,7 @@ export declare class Evaluator {
401
401
  */
402
402
  fnAVG(...args: Array<any>): number;
403
403
  /**
404
- * 返回数据点与数据均值点之差(数据偏差)的平方和
404
+ * 返回数据点与数据均值点之差(数据偏差)的平方和,如果只有一个参数且是数组,则计算这个数组内的值
405
405
  *
406
406
  * @example DEVSQ(num1, num2, ...numN)
407
407
  * @param {...number} num - 要处理的数字
@@ -421,7 +421,7 @@ export declare class Evaluator {
421
421
  */
422
422
  fnAVEDEV(...args: Array<any>): number | null;
423
423
  /**
424
- * 数据点的调和平均值
424
+ * 数据点的调和平均值,如果只有一个参数且是数组,则计算这个数组内的值
425
425
  *
426
426
  * @example HARMEAN(num1, num2, ...numN)
427
427
  * @param {...number} num - 要处理的数字
@@ -1020,7 +1020,7 @@ export declare class Evaluator {
1020
1020
  * 返回数组的长度
1021
1021
  *
1022
1022
  * @param {Array<any>} arr 数组
1023
- * @namespace 其他
1023
+ * @namespace 数组
1024
1024
  * @example COUNT(arr)
1025
1025
  * @returns {boolean} 结果
1026
1026
  */
@@ -1030,9 +1030,36 @@ export declare class Evaluator {
1030
1030
  *
1031
1031
  * @param {Array<any>} arr 数组
1032
1032
  * @param {Function<any>} iterator 箭头函数
1033
- * @namespace 其他
1033
+ * @namespace 数组
1034
1034
  * @example ARRAYMAP(arr, item => item)
1035
1035
  * @returns {boolean} 结果
1036
1036
  */
1037
1037
  fnARRAYMAP(value: any, iterator: any): any[];
1038
+ /**
1039
+ * 数组过滤掉 false、null、0 和 ""
1040
+ *
1041
+ * 示例:
1042
+ *
1043
+ * COMPACT([0, 1, false, 2, '', 3]) 得到 [1, 2, 3]
1044
+ *
1045
+ * @param {Array<any>} arr 数组
1046
+ * @namespace 数组
1047
+ * @example COMPACT(arr)
1048
+ * @returns {Array<any>} 结果
1049
+ */
1050
+ fnCOMPACT(arr: any[]): any[];
1051
+ /**
1052
+ * 数组转成字符串
1053
+ *
1054
+ * 示例:
1055
+ *
1056
+ * JOIN(['a', 'b', 'c'], '~') 得到 'a~b~c'
1057
+ *
1058
+ * @param {Array<any>} arr 数组
1059
+ * @param { String} separator 分隔符
1060
+ * @namespace 数组
1061
+ * @example JOIN(arr, string)
1062
+ * @returns {String} 结果
1063
+ */
1064
+ fnJOIN(arr: any[], separator?: string): string;
1038
1065
  }
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * amis-formula v1.3.12
2
+ * amis-formula v1.3.15
3
3
  * Copyright 2021-2022 fex
4
4
  */
5
5
 
@@ -2168,6 +2168,12 @@ var Evaluator = /** @class */ (function () {
2168
2168
  ? sessionStorage.getItem(name)
2169
2169
  : localStorage.getItem(name);
2170
2170
  if (typeof raw === 'string') {
2171
+ // 判断字符串是否一个纯数字字符串,如果是,则对比parse后的值和原值是否相同,
2172
+ // 如果不同则返回原值,因为原值如果是一个很长的纯数字字符串,则 parse 后可能会丢失精度
2173
+ if (/^\d+$/.test(raw)) {
2174
+ var parsed = JSON.parse(raw);
2175
+ return "".concat(parsed) === raw ? parsed : raw;
2176
+ }
2171
2177
  return parseJson(raw, raw);
2172
2178
  }
2173
2179
  return undefined;
@@ -2364,7 +2370,7 @@ var Evaluator = /** @class */ (function () {
2364
2370
  return Math.abs(a);
2365
2371
  };
2366
2372
  /**
2367
- * 获取最大值
2373
+ * 获取最大值,如果只有一个参数且是数组,则计算这个数组内的值
2368
2374
  *
2369
2375
  * @example MAX(num1, num2, ...numN)
2370
2376
  * @param {...number} num - 数值
@@ -2378,10 +2384,14 @@ var Evaluator = /** @class */ (function () {
2378
2384
  for (var _i = 0; _i < arguments.length; _i++) {
2379
2385
  args[_i] = arguments[_i];
2380
2386
  }
2381
- return Math.max.apply(Math, args.map(function (item) { return _this.formatNumber(item); }));
2387
+ var arr = args;
2388
+ if (args.length === 1 && Array.isArray(args[0])) {
2389
+ arr = args[0];
2390
+ }
2391
+ return Math.max.apply(Math, arr.map(function (item) { return _this.formatNumber(item); }));
2382
2392
  };
2383
2393
  /**
2384
- * 获取最小值
2394
+ * 获取最小值,如果只有一个参数且是数组,则计算这个数组内的值
2385
2395
  *
2386
2396
  * @example MIN(num1, num2, ...numN)
2387
2397
  * @param {...number} num - 数值
@@ -2395,10 +2405,14 @@ var Evaluator = /** @class */ (function () {
2395
2405
  for (var _i = 0; _i < arguments.length; _i++) {
2396
2406
  args[_i] = arguments[_i];
2397
2407
  }
2398
- return Math.min.apply(Math, args.map(function (item) { return _this.formatNumber(item); }));
2408
+ var arr = args;
2409
+ if (args.length === 1 && Array.isArray(args[0])) {
2410
+ arr = args[0];
2411
+ }
2412
+ return Math.min.apply(Math, arr.map(function (item) { return _this.formatNumber(item); }));
2399
2413
  };
2400
2414
  /**
2401
- * 求和
2415
+ * 求和,如果只有一个参数且是数组,则计算这个数组内的值
2402
2416
  *
2403
2417
  * @example SUM(num1, num2, ...numN)
2404
2418
  * @param {...number} num - 数值
@@ -2412,7 +2426,11 @@ var Evaluator = /** @class */ (function () {
2412
2426
  for (var _i = 0; _i < arguments.length; _i++) {
2413
2427
  args[_i] = arguments[_i];
2414
2428
  }
2415
- return args.reduce(function (sum, a) { return sum + _this.formatNumber(a) || 0; }, 0);
2429
+ var arr = args;
2430
+ if (args.length === 1 && Array.isArray(args[0])) {
2431
+ arr = args[0];
2432
+ }
2433
+ return arr.reduce(function (sum, a) { return sum + _this.formatNumber(a) || 0; }, 0);
2416
2434
  };
2417
2435
  /**
2418
2436
  * 将数值向下取整为最接近的整数
@@ -2523,7 +2541,7 @@ var Evaluator = /** @class */ (function () {
2523
2541
  return Math.sqrt(this.formatNumber(n));
2524
2542
  };
2525
2543
  /**
2526
- * 返回所有参数的平均值
2544
+ * 返回所有参数的平均值,如果只有一个参数且是数组,则计算这个数组内的值
2527
2545
  *
2528
2546
  * @example AVG(num1, num2, ...numN)
2529
2547
  * @param {...number} num - 要处理的数字
@@ -2537,10 +2555,14 @@ var Evaluator = /** @class */ (function () {
2537
2555
  for (var _i = 0; _i < arguments.length; _i++) {
2538
2556
  args[_i] = arguments[_i];
2539
2557
  }
2540
- return (this.fnSUM.apply(this, args.map(function (item) { return _this.formatNumber(item); })) / args.length);
2558
+ var arr = args;
2559
+ if (args.length === 1 && Array.isArray(args[0])) {
2560
+ arr = args[0];
2561
+ }
2562
+ return (this.fnSUM.apply(this, arr.map(function (item) { return _this.formatNumber(item); })) / arr.length);
2541
2563
  };
2542
2564
  /**
2543
- * 返回数据点与数据均值点之差(数据偏差)的平方和
2565
+ * 返回数据点与数据均值点之差(数据偏差)的平方和,如果只有一个参数且是数组,则计算这个数组内的值
2544
2566
  *
2545
2567
  * @example DEVSQ(num1, num2, ...numN)
2546
2568
  * @param {...number} num - 要处理的数字
@@ -2557,7 +2579,11 @@ var Evaluator = /** @class */ (function () {
2557
2579
  if (args.length === 0) {
2558
2580
  return null;
2559
2581
  }
2560
- var nums = args.map(function (item) { return _this.formatNumber(item); });
2582
+ var arr = args;
2583
+ if (args.length === 1 && Array.isArray(args[0])) {
2584
+ arr = args[0];
2585
+ }
2586
+ var nums = arr.map(function (item) { return _this.formatNumber(item); });
2561
2587
  var sum = nums.reduce(function (sum, a) { return sum + a || 0; }, 0);
2562
2588
  var mean = sum / nums.length;
2563
2589
  var result = 0;
@@ -2585,7 +2611,11 @@ var Evaluator = /** @class */ (function () {
2585
2611
  if (args.length === 0) {
2586
2612
  return null;
2587
2613
  }
2588
- var nums = args.map(function (item) { return _this.formatNumber(item); });
2614
+ var arr = args;
2615
+ if (args.length === 1 && Array.isArray(args[0])) {
2616
+ arr = args[0];
2617
+ }
2618
+ var nums = arr.map(function (item) { return _this.formatNumber(item); });
2589
2619
  var sum = nums.reduce(function (sum, a) { return sum + a || 0; }, 0);
2590
2620
  var mean = sum / nums.length;
2591
2621
  var result = 0;
@@ -2596,7 +2626,7 @@ var Evaluator = /** @class */ (function () {
2596
2626
  return result / nums.length;
2597
2627
  };
2598
2628
  /**
2599
- * 数据点的调和平均值
2629
+ * 数据点的调和平均值,如果只有一个参数且是数组,则计算这个数组内的值
2600
2630
  *
2601
2631
  * @example HARMEAN(num1, num2, ...numN)
2602
2632
  * @param {...number} num - 要处理的数字
@@ -2613,7 +2643,11 @@ var Evaluator = /** @class */ (function () {
2613
2643
  if (args.length === 0) {
2614
2644
  return null;
2615
2645
  }
2616
- var nums = args.map(function (item) { return _this.formatNumber(item); });
2646
+ var arr = args;
2647
+ if (args.length === 1 && Array.isArray(args[0])) {
2648
+ arr = args[0];
2649
+ }
2650
+ var nums = arr.map(function (item) { return _this.formatNumber(item); });
2617
2651
  var den = 0;
2618
2652
  for (var _a = 0, nums_3 = nums; _a < nums_3.length; _a++) {
2619
2653
  var num = nums_3[_a];
@@ -3470,7 +3504,7 @@ var Evaluator = /** @class */ (function () {
3470
3504
  * 返回数组的长度
3471
3505
  *
3472
3506
  * @param {Array<any>} arr 数组
3473
- * @namespace 其他
3507
+ * @namespace 数组
3474
3508
  * @example COUNT(arr)
3475
3509
  * @returns {boolean} 结果
3476
3510
  */
@@ -3482,7 +3516,7 @@ var Evaluator = /** @class */ (function () {
3482
3516
  *
3483
3517
  * @param {Array<any>} arr 数组
3484
3518
  * @param {Function<any>} iterator 箭头函数
3485
- * @namespace 其他
3519
+ * @namespace 数组
3486
3520
  * @example ARRAYMAP(arr, item => item)
3487
3521
  * @returns {boolean} 结果
3488
3522
  */
@@ -3495,6 +3529,56 @@ var Evaluator = /** @class */ (function () {
3495
3529
  return _this.callAnonymousFunction(iterator, [item, index]);
3496
3530
  });
3497
3531
  };
3532
+ /**
3533
+ * 数组过滤掉 false、null、0 和 ""
3534
+ *
3535
+ * 示例:
3536
+ *
3537
+ * COMPACT([0, 1, false, 2, '', 3]) 得到 [1, 2, 3]
3538
+ *
3539
+ * @param {Array<any>} arr 数组
3540
+ * @namespace 数组
3541
+ * @example COMPACT(arr)
3542
+ * @returns {Array<any>} 结果
3543
+ */
3544
+ Evaluator.prototype.fnCOMPACT = function (arr) {
3545
+ if (Array.isArray(arr)) {
3546
+ var resIndex = 0;
3547
+ var result = [];
3548
+ for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) {
3549
+ var item = arr_1[_i];
3550
+ if (item) {
3551
+ result[resIndex++] = item;
3552
+ }
3553
+ }
3554
+ return result;
3555
+ }
3556
+ else {
3557
+ return [];
3558
+ }
3559
+ };
3560
+ /**
3561
+ * 数组转成字符串
3562
+ *
3563
+ * 示例:
3564
+ *
3565
+ * JOIN(['a', 'b', 'c'], '~') 得到 'a~b~c'
3566
+ *
3567
+ * @param {Array<any>} arr 数组
3568
+ * @param { String} separator 分隔符
3569
+ * @namespace 数组
3570
+ * @example JOIN(arr, string)
3571
+ * @returns {String} 结果
3572
+ */
3573
+ Evaluator.prototype.fnJOIN = function (arr, separator) {
3574
+ if (separator === void 0) { separator = ''; }
3575
+ if (Array.isArray(arr)) {
3576
+ return arr.join(separator);
3577
+ }
3578
+ else {
3579
+ return '';
3580
+ }
3581
+ };
3498
3582
  Evaluator.defaultFilters = {};
3499
3583
  return Evaluator;
3500
3584
  }());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "amis-formula",
3
- "version": "1.3.12",
3
+ "version": "1.3.15",
4
4
  "description": "负责 amis 里面的表达式实现,内置公式,编辑器等",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
package/rollup.config.js CHANGED
@@ -30,6 +30,7 @@ export default {
30
30
  plugins: [
31
31
  isForLib && terser()
32
32
  ],
33
+ strict: !isForLib,
33
34
  footer: isForLib ? `var evaluate = formula.evaluate;
34
35
  var momentFormat = formula.momentFormat;
35
36
  var parse = formula.parse;` : '',
@@ -67,7 +68,8 @@ export default {
67
68
  json(),
68
69
  resolve({
69
70
  jsnext: true,
70
- main: true
71
+ main: true,
72
+ browser: true
71
73
  }),
72
74
  typescript({
73
75
  typescript: require('typescript')