t-comm
Version:
专业、稳定、纯粹的工具库
395 lines (390 loc) • 9.78 kB
JavaScript
'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;