UNPKG

t-comm

Version:

专业、稳定、纯粹的工具库

395 lines (390 loc) 9.78 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var tslib_es6 = require('../tslib.es6-01322ba9.js'); var number_number = require('../number/number.js'); /** * 判断数组是否全部相等 * @param {Array<number | string>} list - 数组 * @returns {Boolean} 是否全部相等 * * @example * isListAllEqual([0, 0, 0]) * * // true * * isListAllEqual([0, 0, 2]) * * // false */ function isListAllEqual(list) { if (list === void 0) { list = []; } if (!list.length) return true; var value = list[0]; for (var _i = 0, _a = list.slice(1); _i < _a.length; _i++) { var item = _a[_i]; if (item !== value) return false; } return true; } /** * 获取对象的value列表,并输出大对象形式 * @param {Array<any>} data * @returns {Object} 处理后的对象 * * @example * * const data = [ * { * Project: 'x', * Request: 1, * Score: 'a' * }, * { * Project: 'y', * Request: 2, * Score: 'b' * }] * * getKeyValuesMap(data) * * // 结果为: * { * Project: ['x', 'y'], * Request: [1, 2], * Score: ['a', 'b'], * } * * // 也支持参数为带value属性的对象数组,如: * * const data = [ * { * Project: { * value: 'x' * } * },{ * Project: { * value: 'y' * } * }] * * // 结果为: * { * Project: ['x', 'y'] * } */ function getKeyValuesMap(data) { if (data === void 0) { data = []; } if (!data.length) return {}; var keys = Object.keys(data[0]); var keyValueMap = {}; data.forEach(function (item) { keys.forEach(function (key) { var _a; // 如果有value,就取value,否则直接取item[key] var value = ((_a = item[key]) === null || _a === void 0 ? void 0 : _a.value) || item[key]; if (keyValueMap[key]) { keyValueMap[key].push(value); } else { keyValueMap[key] = [value]; } }); }); return keyValueMap; } /** * 标记最大最小值 * @private * @param {object} params 参数对象 * @param {Array<number>} params.values 待处理的数组 * @param {number} params.value 当前值 * @param {Object} params.obj 迭代中的对象 * @returns {Object} 处理后的对象 */ function markMaxAndMinOfObj(_a) { var values = _a.values, value = _a.value, obj = _a.obj; var idx = values.indexOf(value); var lastIdx = values.indexOf(value); var newObj = tslib_es6.__assign(tslib_es6.__assign({}, obj), { idx: idx, lastIdx: lastIdx }); if (!isListAllEqual(values)) { var len = values.length; var isMax = idx === 0; var isSecondMax = idx === 1; var isMin = idx === len - 1; var isSecondMin = idx === len - 2; newObj = tslib_es6.__assign(tslib_es6.__assign({}, newObj), { isMax: isMax, isMin: isMin, isSecondMax: isSecondMax, isSecondMin: isSecondMin }); } return newObj; } /** * 获取相对上次的比例,会给输入的对象数组的每一项增加 ratio、previousValue 属性 * @param {Array<Object>} data - 输入数据 * @param {Object} preDataMap - 上次数据的map * @param {string} uniqKey - 唯一键 * * @example * const data = [{ * Project: { value: 'mj-match', name: 'Project' }, * Request: { * value: 854, * name: 'Request', * idx: 19, * lastIdx: 19, * isMax: false, * isMin: false, * isSecondMax: false, * isSecondMin: true, * }, * }]; * * const preDataMap = { * 'mj-match': { * Project: 'mj-match', * Request: 4, * Score: 91.81, * FirstLoadTime: 178, * WholePageTime: 1035, * ParseDomTime: 484, * DNSLinkTime: 0, * DOMTime: 414, * TCP: 0, * HTTP: 275, * BackEnd: 60, * CGIFailNum: 0, * ErrorLogNum: 0, * CGIRequestNum: 83, * }, * }; * * getPreviousRatio(data, preDataMap); * * // data会变成: * [{ * Project: { value: 'mj-match', name: 'Project' }, * Request: { * value: 854, * name: 'Request', * idx: 19, * lastIdx: 19, * isMax: false, * isMin: false, * isSecondMax: false, * isSecondMin: true, * * previousValue: 4, // 新增属性 * ratio: "+999+%" // 新增属性 * }, * }]; */ function getPreviousRatio(data, preDataMap, uniqKey) { if (data === void 0) { data = []; } if (preDataMap === void 0) { preDataMap = {}; } if (uniqKey === void 0) { uniqKey = 'Project'; } data.forEach(function (item) { Object.keys(item).forEach(function (key) { var _a, _b; var obj = item[key]; if (typeof (obj === null || obj === void 0 ? void 0 : obj.value) === 'number') { var uniqVal = (_a = item[uniqKey]) === null || _a === void 0 ? void 0 : _a.value; var preValue = (_b = preDataMap === null || preDataMap === void 0 ? void 0 : preDataMap[uniqVal]) === null || _b === void 0 ? void 0 : _b[key]; if (preValue === undefined) { obj.ratio = ''; } else { obj.ratio = number_number.getUnitPreviousRatio(obj.value, preValue); obj.previousValue = preValue; } } }); }); } /** * 给对象数组的每一项,添加isMax、isMin、、isSecondMax、isSecondMin、idx、lastIdx等属性 * @param {Array<object>} data 原始数据 * @param {Array<string>} reverseScoreKeys - 逆序的key列表 * @returns {Object} 处理后的数据 * * @example * const data = [{ * ProjectName: { name: 'ProjectName', value: '麻将赛事' }, * PagePv: { name: 'PagePv', value: 2877 }, * }, { * ProjectName: { name: 'ProjectName', value: '斗地主赛事' }, * PagePv: { name: 'PagePv', value: 7 }, * }, * // ... * ]; * * getMaxAndMinIdx(data, []) * * // => * [{ * ProjectName: { name: 'ProjectName', value: '麻将赛事' }, * PagePv: { * name: 'PagePv', * value: 2877, * idx: 6, * lastIdx: 6, * isMax: false, * isMin: false, * isSecondMax: false, * isSecondMin: false, * }, * }]; * */ function getMaxAndMinIdx(data, reverseScoreKeys) { if (data === void 0) { data = []; } if (reverseScoreKeys === void 0) { reverseScoreKeys = []; } if (!data.length) return []; var keys = Object.keys(data[0]); var keyValueMap = getKeyValuesMap(data); var parsedData = data.map(function (item) { var temp = tslib_es6.__assign({}, item); keys.forEach(function (key) { var values = keyValueMap[key]; var itemInfo = item[key] || {}; if (values && typeof itemInfo.value === 'number') { if (reverseScoreKeys.indexOf(key) > -1) { values.sort(function (a, b) { if (a > b) return 1; if (a < b) return -1; return 0; }); } else { values.sort(function (a, b) { if (a > b) return -1; if (a < b) return 1; return 0; }); } temp[key] = markMaxAndMinOfObj({ values: values, value: itemInfo.value, obj: temp[key] }); } }); return temp; }); return parsedData; } /** * 拉平之前数据 * @param {Array<Object>} preDataList 之前的数据,作为对照 * @param {string} key 主键 * @returns {Object} preDataMap * * @example * const data = [{ * ProjectName: { name: 'ProjectName', value: '研发平台' }, * PagePv: { name: 'PagePv', value: 152 }, * PageUv: { name: 'PageUv', value: 7 }, * Score: { name: 'Score', value: 93.92 }, * PageDuration: { name: 'PageDuration', value: 1281.58 }, * PageError: { name: 'PageError', value: 2 }, * }]; * * flattenPreData(data, 'ProjectName'); * * // 输出 * { * 研发平台: { * ProjectName: '研发平台', * PagePv: 152, * PageUv: 7, * Score: 93.92, * PageDuration: 1281.58, * PageError: 2, * }, * }; */ function flattenPreData(preDataList, key) { var preDataMap = preDataList.reduce(function (acc, item) { var _a; acc[((_a = item[key]) === null || _a === void 0 ? void 0 : _a.value) || 'DEFAULT_KEY'] = Object.values(item).reduce(function (ac, it) { ac[it.name] = it.value; return ac; }, {}); return acc; }, {}); return preDataMap; } /** * 对比两个对象列表 * @param {Array<object>} list 现在数据 * @param {Array<object>} preList 参照数据 * @param {string} key 唯一key名称 * @returns {Array<object>} 对比结果,增加为list的每一项增加previousValue和ratio属性 * @example * const list = [ * { * ProjectName: { name: 'ProjectName', value: '脚手架' }, * PagePv: { name: 'PagePv', value: 544343 }, * PageUv: { name: 'PageUv', value: 225275 }, * } * ] * * const preList = [ * { * ProjectName: { name: 'ProjectName', value: '脚手架' }, * PagePv: { name: 'PagePv', value: 123123 }, * PageUv: { name: 'PageUv', value: 33333 }, * } * ] * * compareTwoList(list, preList, 'ProjectName') * * console.log(list) * * [ * { * ProjectName: { name: 'ProjectName', value: '脚手架' }, * PagePv: { * name: 'PagePv', * value: 544343, * ratio: '+342.1%', * previousValue: 123123 * }, * PageUv: { * name: 'PageUv', * value: 225275, * ratio: '+575.8%', * previousValue: 33333 * } * } * ] */ function compareTwoList(list, preList, key) { var preDataMap = flattenPreData(preList, key); getPreviousRatio(list, preDataMap, key); return list; } exports.compareTwoList = compareTwoList; exports.flattenPreData = flattenPreData; exports.getKeyValuesMap = getKeyValuesMap; exports.getMaxAndMinIdx = getMaxAndMinIdx; exports.getPreviousRatio = getPreviousRatio; exports.isListAllEqual = isListAllEqual;