自己前端工作中常用的一些公共函数

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

 

posted @ 2022-04-24 15:00  cuteyuchen  阅读(155)  评论(0编辑  收藏  举报