自己前端工作中常用的一些公共函数
// 树转数组树 function treeTolistTree(arr) { var res = [] !(function fn(arr) { arr.forEach(function (item, index) { res.push(item) if (item.hasChild && item.children.length > 0) { fn(item.children) } }) })(arr) return res }
// 把枚举值转成中文显示返回状态对应中文名称 export const toCN = (items, id, label = 'name', code = 'code') => { let data = '' for (var j of items) { if (j[code] === id) { data = j[label] } } if (data !== '') { return data } else { return '无' } }
//二分法计算数字在最近的数组下标 export const binarySearch = function (num, arr) { var left = 0; var right = arr.length; while (left <= right) { var center = Math.floor((left + right) / 2); if (num < arr[center]) { right = center - 1; } else { left = center + 1; } } return right }
//计算洪水场次的精度评定
/**
* @param resultList {Array} 列表中包含{
* @param tm {String}} '2020-12-12 00:00:00' 时间
* @param realQ {Number}} 0 实测流量
* @param q {Number} 0 预报流量
* }
* @param step {Number} 0 步长 默认为1
* */
export const getAnotherList = function (resultList, step = 1) {
let realHfList,//实测洪峰列表
forecastHfList,//预报洪峰列表
realHfQ,//实测洪峰流量
forecastHfQ,//预报洪峰流量
hfError,//洪峰误差
realHfFlow,//实测洪量
forecastHfFlow,//预报洪量
hfFlowError,//洪量误差
realHfTime,//实测峰现时间
forecastHfTime,//预报峰现时间
hfTmPermitError,//峰现时间许可误差
hfTmError,//误差
dc//确定性系数
realHfList = resultList.map(item => item.realQ === '' ? 0 : Number(item.realQ))
forecastHfList = resultList.map(item => item.q === '' ? 0 : Number(item.q))
realHfQ = Math.max(...realHfList)
forecastHfQ = Math.max(...forecastHfList)
hfError = realHfQ !== 0 ? (Math.abs(forecastHfQ - realHfQ)) / realHfQ * 100 : 0
realHfFlow = (realHfList.reduce((pre, cur) => pre + cur)) * step * 3600 / 1000000
forecastHfFlow = (forecastHfList.reduce((pre, cur) => pre + cur)) * step * 3600 / 1000000
hfFlowError = realHfFlow !== 0 ? (Math.abs(forecastHfFlow - realHfFlow)) / realHfFlow * 100 : 0
realHfTime = resultList[realHfList.indexOf(Math.max(...realHfList))].tm
forecastHfTime = resultList[forecastHfList.indexOf(Math.max(...forecastHfList))].tm
hfTmPermitError = resultList.length * 0.3 < 3 ? 3 : resultList.length * 0.3
hfTmError = Math.abs(moment(realHfTime).diff(moment(forecastHfTime), "h"))
let dcMolecule = 0,//确定性系数分子(每个时刻的[预报值-实测值]的平方的和)
dcDenominator = 0//确定性系数分母 (每个时刻的[实测值-实测值的均值]的平方的和))
//求realHfList的平均值
let realHfListAvg = realHfList.reduce((pre, cur) => pre + cur) / realHfList.length
forecastHfList.forEach((item, index) => {
dcMolecule += (item - realHfList[index]) * (item - realHfList[index])
dcDenominator += (realHfList[index] - realHfListAvg) * (realHfList[index] - realHfListAvg)
})
dc = dcDenominator !== 0 ? toFixed(1 - (dcMolecule / dcDenominator), 2) : 0
return {
realHfQ: validDigits(realHfQ),
forecastHfQ: validDigits(forecastHfQ),
hfError: validDigits(hfError),
realHfFlow: validDigits(realHfFlow),
forecastHfFlow: validDigits(forecastHfFlow),
hfFlowError: validDigits(hfFlowError),
realHfTime,
forecastHfTime,
hfTmPermitError,
hfTmError,
dc
}
}