UNPKG

@antv/s2

Version:

effective spreadsheet render core lib

111 lines 4.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.calcActionByType = exports.getDataCountByField = exports.getDataAvgByField = exports.getDataExtremumByField = exports.getDataSumByField = exports.canConvertToNumber = exports.isNotNumber = void 0; const tslib_1 = require("tslib"); const decimal_js_1 = tslib_1.__importDefault(require("decimal.js")); const interface_1 = require("../common/interface"); const cell_data_1 = require("../data-set/cell-data"); const isNotNumber = (value) => { if (typeof value === 'number') { return Number.isNaN(value); } if (!value) { return true; } if (typeof value === 'string') { return Number.isNaN(Number(value)); } return true; }; exports.isNotNumber = isNotNumber; const canConvertToNumber = (a) => !(0, exports.isNotNumber)(a); exports.canConvertToNumber = canConvertToNumber; /** * 预处理原始数据为 Decimal 对象数组 * 所有不能转为 number 的数据默认为 0 * @param data 原始数据数组 * @param field 值字段 * @param filterIllegalValue 是否过滤非法值?过滤后,包装后的数据数组短于原始数组长度 * @returns 经过 Decimal 包装后的值数组 */ const processFieldValues = (data, field, filterIllegalValue = false) => { if (!(data === null || data === void 0 ? void 0 : data.length)) { return []; } return data.reduce((resultArr, item) => { const fieldValue = cell_data_1.CellData.getFieldValue(item, field); const notNumber = (0, exports.isNotNumber)(fieldValue); if (filterIllegalValue && notNumber) { // 过滤非法值 return resultArr; } const val = notNumber ? 0 : fieldValue; resultArr.push(new decimal_js_1.default(val)); return resultArr; }, []); }; /** * 计算数据项的和 * @param data 数据项 * @param field 值字段 * @returns 算术和 */ const getDataSumByField = (data, field) => { const fieldValues = processFieldValues(data, field); if (!fieldValues.length) { return 0; } return decimal_js_1.default.sum(...fieldValues).toNumber(); }; exports.getDataSumByField = getDataSumByField; /** * 计算数据项的极值 * @param method 最大值(max)或最小值(min) * @param data 数据项 * @param field 值字段 * @returns 最值 */ const getDataExtremumByField = (method, data, field) => { // 防止预处理时默认值 0 影响极值结果,处理时需过滤非法值 const fieldValues = processFieldValues(data, field, true); if (!(fieldValues === null || fieldValues === void 0 ? void 0 : fieldValues.length)) { return; } return decimal_js_1.default[method](...fieldValues).toNumber(); }; exports.getDataExtremumByField = getDataExtremumByField; /** * 计算数据项的平均值 * @param data 数据项 * @param field 值字段 * @returns 算术平均值 */ const getDataAvgByField = (data, field) => { const fieldValues = processFieldValues(data, field); if (!(fieldValues === null || fieldValues === void 0 ? void 0 : fieldValues.length)) { return 0; } return decimal_js_1.default.sum(...fieldValues) .dividedBy(fieldValues.length) .toNumber(); }; exports.getDataAvgByField = getDataAvgByField; /** * * @param data */ const getDataCountByField = (data) => { return (data === null || data === void 0 ? void 0 : data.length) || 0; }; exports.getDataCountByField = getDataCountByField; /** * totals 计算方法集合 */ exports.calcActionByType = { [interface_1.Aggregation.SUM]: exports.getDataSumByField, [interface_1.Aggregation.MIN]: (data, field) => (0, exports.getDataExtremumByField)('min', data, field), [interface_1.Aggregation.MAX]: (data, field) => (0, exports.getDataExtremumByField)('max', data, field), [interface_1.Aggregation.AVG]: exports.getDataAvgByField, [interface_1.Aggregation.COUNT]: exports.getDataCountByField, }; //# sourceMappingURL=number-calculate.js.map