Commit 6fc1f969 by lixinming

no message

parent c218dd52
......@@ -981,6 +981,11 @@
"resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz",
"integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew="
},
"pyfl": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/pyfl/-/pyfl-1.1.4.tgz",
"integrity": "sha512-tEwj+SYfOk7zMStPrcDvadkUYomRIX6URQA/dl+YDqaEZlP9gEXM501FUsorz5HozCkfIeFOoT7U2jTElQ+zYg=="
},
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz",
......
......@@ -17,6 +17,7 @@
"mysql": "^2.18.1",
"node-xlsx": "^0.16.1",
"nodemailer": "^6.1.1",
"pyfl": "^1.1.4",
"request": "^2.88.0",
"svg-captcha": "^1.3.12",
"ws": "^5.2.2"
......
import { BizError } from "../util/bizError";
import pyfl from 'pyfl';
//disintegrate 分解源数据
/**
* analysisPlanarArr 解析二维数组
* @param planarArr 二维数组 例子:[[title1, title2, title3, title4],[value1, value2, value3, value4],[value5, value6, value7, value8]]
* @param titleIndex 标题集合所在第一层数组的下标
* @param titleList 自定义标题列表 不传则会取每个title的中文首字母作为key
* @returns {"dataList":[{title1:value1, title2:value2, title3:value3, title4:value4}, {title1:value5, title2:value6, title3:value7, title4:value8}], titleList:[]}
*/
export function analysisPlanarArr(planarArr, titleIndex = 0, titleList = []) {
let dataTitleList = [];
let dataMaxLength = 0;
for (let i = titleIndex; i< planarArr.length; i++) {
let subList = planarArr[i];
if (i == titleIndex) {
dataTitleList = subList;
continue;
}
dataMaxLength = Math.max(subList.length, dataMaxLength);
}
let useTitleList = !titleList.length ? changeChineseTitleIntoEnglish(dataTitleList) : titleList;
if (dataMaxLength == 2 && !titleList.length) useTitleList = ["key", "value"];
if (dataTitleList.length < dataMaxLength ) throw new BizError(`解析时数据异常 数据长度:${dataMaxLength} 大于 标题长度${dataTitleList}`);
if (titleList.length && titleList.length < dataMaxLength) throw new BizError(`解析时数据异常 传入标题长度${titleList.length} 数据最大长度${dataMaxLength}`);
let dataList = [];
for (let i = (titleIndex + 1); i< planarArr.length; i++) {
let subList = planarArr[i];
let addInfo:any = {};
subList.forEach((item, index) => {
let key = useTitleList[index];
let value = item;
addInfo[key] = value;
});
dataList.push(addInfo);
}
return {dataList, titleList:useTitleList };
}
function changeChineseTitleIntoEnglish(titles) {
let result = [];
titles.forEach(chineseStr => {
result.push(pyfl(chineseStr).toLowerCase());
});
return result;
}
/**
* deconstructPlanarArr 解构二维数组
* 第一列是名称
* @param planarArr 二维数组 例:[[name, 1月, 2月, 3月],[数据1, 1月数据, 2月数据,3月数据 ],[数据2, 1月数据, 2月数据,3月数据]]
* @param titleIndex 标题集合所在第一层数组的下标
* @returns {"name":[{key:"1月", value:"1月数据"}]};
*/
export function deconstructPlanarArr(planarArr, titleIndex = 0) {
let dataInfo = {};
let titleList = [];
for (let i = titleIndex; i < planarArr.length; i++) {
let subList = planarArr[i];
if (titleIndex == i){
titleList = subList.slice(1, subList.length);
} else {
let thisDataName = "";
let thisDataList = [];
subList.forEach((item, index) => {
if (!index) {
thisDataName = item;
return;
}
let key = titleList[index];
thisDataList.push({key, value:item});
});
dataInfo[thisDataName] = thisDataList;
}
}
return dataInfo;
}
/**
* decollatePlanarArr 拆解二维数组
* @param planarArr 二维数组
* @param decollateIndex 拆解开始的下标
* @returns {headerList:decollateIndex下标之前的集合(包括decollateIndex), bodyList:decollateIndex下标之后的集合(不包括decollateIndex)}
*/
export function decollatePlanarArr(planarArr, decollateIndex = 0) {
let headerList = planarArr.slice(decollateIndex, decollateIndex + 1);
let bodyList = planarArr.slice(decollateIndex + 1, planarArr.length);
return {headerList, bodyList};
}
/**
* getValueListByKey 获取dataList中所有key为keyName 的数据并返回
* @param dataList [{key, value},{}]
* @returns [value1,value2]
*/
export function getValueListByKey(dataList, keyName = 'value') {
let result = [];
dataList.forEach(info => {
result.push(info[keyName]);
});
return result;
}
//打包完数据之后的处理
/**
* recombinationObject 重组对象 在打包完数据后使用 必须是keyvalue之后
* @param data [{key:key1, value:value1, unit:unit1 }, {key:key2, value:value2, unit:unit2}]
* @param check {"key2":[{key:"key1", name:""}] }
* @returns [{key:key1, value:value1, key2:key2, value2:value2}]
*/
export function recombinationObject(data, checkInfo) {
let dataMap = {};
data.forEach(info => {
let { key } = info;
dataMap[key] = info;
});
let removeKeyMap = {};
for (let checkKey in checkInfo) {
let checkList = checkInfo[checkKey];
checkList.forEach(item => {
let {key, name} = item;
removeKeyMap[key] = 1;
let onceCheck = dataMap[key];
dataMap[checkKey][name] = onceCheck.value;
dataMap[checkKey][`${name}Unit`] = onceCheck.unit;
});
}
let dataList = [];
data.forEach(info => {
let { key } = info;
if (removeKeyMap[key]) return;
dataList.push(dataMap[key]);
});
return dataList;
}
//封装数据 变成可以给out使用的格式
//逻辑层 变成可以给out使用的格式
//主要逻辑 做类型验证等
import { BizError } from "../util/bizError";
import { separateDataAndUint } from "./privateTools";
//主要逻辑 做类型验证等
const assert = require('assert');
/**
* stringListPackage 打包验证并返回 getStringOut 需要的格式
* @param dataList ["","",""]
......@@ -330,6 +328,8 @@ export function mapPackage(data, isCoordinate=true, isXY=false) {
value = info.value;
} else value = "";
addInfo.value = value;
addInfo.unit = unit;
dataList.push(addInfo);
});
......
import { getUnitMaxOccNum, separateDataAndUint, unifiedMaxAndMinValueAndStep } from "./privateTools";
//此层只做出口封装 尽量减少数据处理的逻辑 逻辑放在上一层
import { separateDataAndUint, unifiedMaxAndMinValueAndStep } from "./privateTools";
//数据出口封装 只做封装 少量的数据校验
/**
* getStringOut 获取文字列表返回结果
......
//仅限cal中使用的工具 禁止做任何修改
/**
* separateDataAndUint 截取字符串中的单位
* @param str 待处理字符串
* @returns {dataNumber:数据, dataUnit:单位}
*/
export function separateDataAndUint(str) {
str = `${str}`;
if (!str) return {dataNum:0, dataUnit:""};
let dataNum = parseFloat(str.replace(/[\u4E00-\u9FA5a-zA-Z]+/,""));
let dataUnit = str.replace(/^(-)?\d+(\.\d+)?/, "");
return {dataNum, dataUnit};
}
/**
* getUnitMaxOccNum 获取出现次数最多的单位
* @param unitMap 统计后的出现过的单位情况 结构{unit:出现次数}
* @returns 出现次数最多的单位
*/1
export function getUnitMaxOccNum(unitMap) {
let max = 0;
let maxUnit = "";
for (let unit in unitMap) {
let occNum = unitMap[unit];
if (occNum > max) {
max = occNum;
maxUnit = unit;
}
}
return maxUnit;
}
/**
* unifiedMaxAndMinValueAndStep 求最大最小值以及间隙
* @param max 最大
* @param min 最小
* @param count 分多少份 默认5
* @returns {maxNumber:向上留值最大, minNumber:向下留值最小, stepNumber:间隔};
*/
export function unifiedMaxAndMinValueAndStep(max, min, count=5) {
let maxNumber = Math.ceil(max);
let minNumber = Math.floor(min);
function getNumberInLength(length) {
let lengthCount = 1;
for (let i = 1; i < length; i++) {
lengthCount = lengthCount * 10;
}
return lengthCount;
}
let maxNumberLength = getNumberInLength(`${maxNumber}`.length);
let minNumberLength = getNumberInLength(`${minNumber}`.length);
if (maxNumber <= 10 && maxNumber > 0) maxNumber = 10;
else maxNumber = Math.ceil(maxNumber / maxNumberLength) * maxNumberLength;
minNumber = Math.floor(minNumber / minNumberLength) * minNumberLength;
let stepNumber = Math.ceil((maxNumber - minNumber) / count);
return {maxNumber, minNumber, stepNumber};
}
export function setRouter(httpServer) {
}
\ No newline at end of file
//三层树
export class dataQueue {
// queue = new Map();
map = {};
stats = {};
constructor() {
}
initQueue(dataList, value, p1, p2?, p3?) {
//p1 = k1 => map = {"aaa":{}, "bbb":{} } map = {"aaa":{"111":{}, "333":{} }, "bbb":{"222":{} } }
}
getSubNodeCount(key) {
return Object.keys(this.map[key]);
}
getOnceCount(key) {
}
startStats() {
}
get() {}
}
let mq = new dataQueue();
let dataList = [
{school:"晨光小学", grade:"一年级", name:"张三", score:90 },
{school:"晨光小学", grade:"二年级", name:"李四", score:80 },
{school:"中心小学", grade:"一年级", name:"王五", score:70 },
];
mq.initQueue(dataList, "score", "school", "grade", "name" );
//{ "晨光小学":{"一年级":{"张三":90, "赵六":91}, "二年级":{"李四":80} }, "中心小学":{"一年级":{"王五":70} } }
// {}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment