function forEach(array, cloneTarget) { let index = -1; const length = array.length; while (++index < length) { cloneTarget(array[index], index); } return array; } 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 = { // 深拷贝 clone: function(target, map = new WeakMap()) { if (typeof target === 'object') { const isArray = Array.isArray(target); let cloneTarget = isArray ? [] : {}; if (map.get(target)) { return target; } map.set(target, cloneTarget); const keys = isArray ? undefined : Object.keys(target); forEach(keys || target, (value, key) => { if (keys) key = value cloneTarget[key] = BeaconUtils.clone(target[key], map); }); return cloneTarget; } else { return target; } }, // 计算距离 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 = {10003:[{},{},···],10002:[{},{},···],10001:[{},{},···]} classification:function (list,key) { let data = {} for(let i = 0; i < list.length; i++) { if(!data[list[i][key]]) { data[list[i][key]] = [list[i]]; }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)) 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) }, //返回数组中最大值的下标 maxIndex:function(arr){ let index = -1,max = arr[0]; for(let i = 0;i < arr.length; i++){ if(arr[i] >= max){ index = i; max = arr[i]; } } if(arr[index] == 0){ return null; } return index; } } module.exports = { formatTime, promisify, BeaconUtils }