util.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. function forEach(array, cloneTarget) {
  2. let index = -1;
  3. const length = array.length;
  4. while (++index < length) {
  5. cloneTarget(array[index], index);
  6. }
  7. return array;
  8. }
  9. const formatTime = date => {
  10. const year = date.getFullYear()
  11. const month = date.getMonth() + 1
  12. const day = date.getDate()
  13. const hour = date.getHours()
  14. const minute = date.getMinutes()
  15. const second = date.getSeconds()
  16. return `${[year, month, day].map(formatNumber).join('/')} ${[hour, minute, second].map(formatNumber).join(':')}`
  17. }
  18. const formatNumber = n => {
  19. n = n.toString()
  20. return n[1] ? n : `0${n}`
  21. }
  22. const promisify = (api) => {
  23. return (options, ...params) => {
  24. return new Promise((resolve, reject) => {
  25. api(Object.assign({}, options, { success: resolve, fail: reject }), ...params);
  26. });
  27. }
  28. }
  29. const BeaconUtils = {
  30. // 深拷贝
  31. clone: function(target, map = new WeakMap()) {
  32. if (typeof target === 'object') {
  33. const isArray = Array.isArray(target);
  34. let cloneTarget = isArray ? [] : {};
  35. if (map.get(target)) {
  36. return target;
  37. }
  38. map.set(target, cloneTarget);
  39. const keys = isArray ? undefined : Object.keys(target);
  40. forEach(keys || target, (value, key) => {
  41. if (keys) key = value
  42. cloneTarget[key] = BeaconUtils.clone(target[key], map);
  43. });
  44. return cloneTarget;
  45. } else {
  46. return target;
  47. }
  48. },
  49. // 计算距离
  50. calculateAccuracy:function(txPower, rssi, n) {
  51. // return (0.89976) * Math.pow(rssi / txPower, 7.7095) + 0.111
  52. return Math.pow(10, Math.abs(rssi - txPower) / (10 * n))
  53. },
  54. //求数组平均值
  55. arrayAverage:function (arr) {
  56. let tmp = arr.reduce((acc, val) => acc + val, 0) / arr.length
  57. return tmp
  58. },
  59. //数组分类:按照关键词key
  60. //data = {10003:[{},{},···],10002:[{},{},···],10001:[{},{},···]}
  61. classification:function (list,key) {
  62. let data = {}
  63. for(let i = 0; i < list.length; i++) {
  64. if(!data[list[i][key]]) {
  65. data[list[i][key]] = [list[i]];
  66. }else {
  67. data[list[i][key]].push(list[i])
  68. }
  69. }
  70. return data
  71. },
  72. //求一维队列某点的高斯模糊权重 @param(队列长度,目标位置, 平均差)
  73. getOneGuassionArray: function(size, kerR, sigma) {
  74. // if (size % 2 > 0) {
  75. // size -= 1
  76. // }
  77. // if (!size) {
  78. // return []
  79. // }
  80. // if (kerR > size-1){
  81. // return []
  82. // }
  83. let sum = 0;
  84. let arr = new Array(size);
  85. //进来的列表的元素可能是一样的,防止平均差为0的情况
  86. if(sigma == 0){
  87. let weight = 1 / size;
  88. return arr.fill(weight)
  89. }
  90. for (let i = 0; i < size; i++) {
  91. arr[i] = Math.exp(-((i - kerR) * (i - kerR)) / (2 * sigma * sigma))
  92. sum += arr[i];
  93. }
  94. return arr.map(e => e / sum);
  95. },
  96. //计算数组平均差
  97. //list:rssi数组
  98. //average:rssi平均值
  99. getMeanDeviation: function(list,average){
  100. let length = list.length;
  101. //数组的每一个数都要减去一个平均数,结果取绝对值
  102. let arr = list.map(num=>Math.abs(num-average))
  103. return arr.reduce((prev,curr)=>prev+curr) / length;
  104. },
  105. //计算数组方差
  106. // list:待计算数组
  107. // average:数组元素平均值
  108. getVariance:function(list,average){
  109. let sum = 0;
  110. for(let element of list){
  111. sum += Math.pow((element - average),2)
  112. }
  113. return sum / list.length
  114. },
  115. //js实现字符串重复的repeat函数
  116. repeat:function(src, n) {
  117. return (new Array(n + 1)).join(src);
  118. },
  119. //计算椭圆长度
  120. //R是预设的有效范围半径
  121. //L是椭圆长度
  122. getLR:function(R,L){
  123. let d = L - R
  124. let r = (R - d) / 2
  125. let h = r + d
  126. return 2*Math.pow((R*R - h*h),0.5)
  127. },
  128. //返回数组中最大值的下标
  129. maxIndex:function(arr){
  130. let index = -1,max = arr[0];
  131. for(let i = 0;i < arr.length; i++){
  132. if(arr[i] >= max){
  133. index = i;
  134. max = arr[i];
  135. }
  136. }
  137. if(arr[index] == 0){
  138. return null;
  139. }
  140. return index;
  141. }
  142. }
  143. module.exports = {
  144. formatTime,
  145. promisify,
  146. BeaconUtils
  147. }