const formatTime = date => { const year = date.getFullYear() const month = date.getMonth() + 1 const day = date.getDate() const hour = date.getHours() const minute = date.getMinutes() const second = date.getSeconds() return `${[year, month, day].map(formatNumber).join('/')} ${[hour, minute, second].map(formatNumber).join(':')}` } const formatNumber = n => { n = n.toString() return n[1] ? n : `0${n}` } const promisify = (api) => { return (options, ...params) => { return new Promise((resolve, reject) => { api(Object.assign({}, options, { success: resolve, fail: reject }), ...params); }); } } const BeaconUtils = { // 计算距离 calculateAccuracy:function(txPower, rssi, n) { // return (0.89976) * Math.pow(rssi / txPower, 7.7095) + 0.111 return Math.pow(10, Math.abs(rssi - txPower) / (10 * n)) }, //求数组平均值 arrayAverage:function (arr) { let tmp = arr.reduce((acc, val) => acc + val, 0) / arr.length return tmp }, //数组分类:按照关键词key //data = {1003:[{},{},···],1002:[{},{},···],1001:[{},{},···]} classification:function (list,key) { let data = {} for(var i = 0; i < list.length; i++) { if(!data[list[i][key]]) { var arr = []; arr.push(list[i]); data[list[i][key]] = arr; }else { data[list[i][key]].push(list[i]) } } return data }, //求一维队列某点的高斯模糊权重 @param(队列长度,目标位置, 平均差) getOneGuassionArray: function(size, kerR, sigma) { // if (size % 2 > 0) { // size -= 1 // } // if (!size) { // return [] // } if (kerR > size-1){ return [] } let sum = 0; let arr = new Array(size); //进来的列表的元素可能是一样的,防止平均差为0的情况 if(sigma == 0){ let weight = 1 / size; return arr.fill(weight) } for (let i = 0; i < size; i++) { arr[i] = Math.exp(-((i - kerR) * (i - kerR)) / (2 * sigma * sigma)) / (sigma * Math.pow(2*Math.PI,0.5)); sum += arr[i]; } return arr.map(e => e / sum); }, //计算数组平均差 //list:rssi数组 //average:rssi平均值 getMeanDeviation: function(list,average){ let length = list.length; //数组的每一个数都要减去一个平均数,结果取绝对值 let arr = list.map(num=>Math.abs(num-average)) return arr.reduce((prev,curr)=>prev+curr) / length; }, //计算数组方差 // list:待计算数组 // average:数组元素平均值 getVariance:function(list,average){ let sum = 0; for(let element of list){ sum += Math.pow((element - average),2) } return sum / list.length }, //js实现字符串重复的repeat函数 repeat:function(src, n) { return (new Array(n + 1)).join(src); }, //计算椭圆长度 //R是预设的有效范围半径 //L是椭圆长度 getLR:function(R,L){ let d = L - R let r = (R - d) / 2 let h = r + d return 2*Math.pow((R*R - h*h),0.5) } } module.exports = { formatTime, promisify, BeaconUtils }