123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- 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
- }
|