util.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. const formatTime = date => {
  2. const year = date.getFullYear()
  3. const month = date.getMonth() + 1
  4. const day = date.getDate()
  5. const hour = date.getHours()
  6. const minute = date.getMinutes()
  7. const second = date.getSeconds()
  8. return `${[year, month, day].map(formatNumber).join('/')} ${[hour, minute, second].map(formatNumber).join(':')}`
  9. }
  10. const formatNumber = n => {
  11. n = n.toString()
  12. return n[1] ? n : `0${n}`
  13. }
  14. const promisify = (api) => {
  15. return (options, ...params) => {
  16. return new Promise((resolve, reject) => {
  17. api(Object.assign({}, options, { success: resolve, fail: reject }), ...params);
  18. });
  19. }
  20. }
  21. const BeaconUtils = {
  22. // 计算距离
  23. calculateAccuracy:function(txPower, rssi, n) {
  24. // return (0.89976) * Math.pow(rssi / txPower, 7.7095) + 0.111
  25. return Math.pow(10, Math.abs(rssi - txPower) / (10 * n))
  26. },
  27. //求数组平均值
  28. arrayAverage:function (arr) {
  29. let tmp = arr.reduce((acc, val) => acc + val, 0) / arr.length
  30. return tmp
  31. },
  32. //数组分类:按照关键词key
  33. //data = {1003:[{},{},···],1002:[{},{},···],1001:[{},{},···]}
  34. classification:function (list,key) {
  35. let data = {}
  36. for(var i = 0; i < list.length; i++) {
  37. if(!data[list[i][key]]) {
  38. var arr = [];
  39. arr.push(list[i]);
  40. data[list[i][key]] = arr;
  41. }else {
  42. data[list[i][key]].push(list[i])
  43. }
  44. }
  45. return data
  46. },
  47. //求一维队列某点的高斯模糊权重 @param(队列长度,目标位置, 平均差)
  48. getOneGuassionArray: function(size, kerR, sigma) {
  49. // if (size % 2 > 0) {
  50. // size -= 1
  51. // }
  52. // if (!size) {
  53. // return []
  54. // }
  55. if (kerR > size-1){
  56. return []
  57. }
  58. let sum = 0;
  59. let arr = new Array(size);
  60. //进来的列表的元素可能是一样的,防止平均差为0的情况
  61. if(sigma == 0){
  62. let weight = 1 / size;
  63. return arr.fill(weight)
  64. }
  65. for (let i = 0; i < size; i++) {
  66. arr[i] = Math.exp(-((i - kerR) * (i - kerR)) / (2 * sigma * sigma)) / (sigma * Math.pow(2*Math.PI,0.5));
  67. sum += arr[i];
  68. }
  69. return arr.map(e => e / sum);
  70. },
  71. //计算数组平均差
  72. //list:rssi数组
  73. //average:rssi平均值
  74. getMeanDeviation: function(list,average){
  75. let length = list.length;
  76. //数组的每一个数都要减去一个平均数,结果取绝对值
  77. let arr = list.map(num=>Math.abs(num-average))
  78. return arr.reduce((prev,curr)=>prev+curr) / length;
  79. },
  80. //计算数组方差
  81. // list:待计算数组
  82. // average:数组元素平均值
  83. getVariance:function(list,average){
  84. let sum = 0;
  85. for(let element of list){
  86. sum += Math.pow((element - average),2)
  87. }
  88. return sum / list.length
  89. },
  90. //js实现字符串重复的repeat函数
  91. repeat:function(src, n) {
  92. return (new Array(n + 1)).join(src);
  93. },
  94. //计算椭圆长度
  95. //R是预设的有效范围半径
  96. //L是椭圆长度
  97. getLR:function(R,L){
  98. let d = L - R
  99. let r = (R - d) / 2
  100. let h = r + d
  101. return 2*Math.pow((R*R - h*h),0.5)
  102. }
  103. }
  104. module.exports = {
  105. formatTime,
  106. promisify,
  107. BeaconUtils
  108. }