// 树转数组树
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
}
}