1. //单对象模式,也叫做命名空间模式
    2. var MyFunctions = {
    3. /**
    4. * 判断一个数是不是奇数
    5. * @param {number} n 要判断的数字
    6. * @returns {boolean}
    7. */
    8. isOdd: function (n) {
    9. return n % 2 !== 0;
    10. },
    11. /**
    12. * 判断一个数是不是素数
    13. * @param {*} n
    14. */
    15. isPrime: function (n) {
    16. if (n < 2) {
    17. return false;
    18. }
    19. for (var i = 2; i < n; i++) {
    20. if (n % i === 0) {
    21. return false;
    22. }
    23. }
    24. return true;
    25. },
    26. /**
    27. * 对数组求和
    28. * @param {*} arr
    29. */
    30. sumOfArray: function (arr) {
    31. var sum = 0;
    32. for (var i = 0; i < arr.length; i++) {
    33. sum += arr[i];
    34. }
    35. return sum;
    36. },
    37. /**
    38. * 得到数组中的最大值,如果数组长度为0,则返回undefined
    39. * @param {*} arr
    40. */
    41. maxOfArray: function (arr) {
    42. if (arr.length === 0) {
    43. return;
    44. }
    45. var max = arr[0];
    46. for (var i = 1; i < arr.length; i++) {
    47. if (arr[i] > max) {
    48. max = arr[i];
    49. }
    50. }
    51. return max;
    52. },
    53. /**
    54. * 得到数组中的最小值,如果数组长度为0,则返回undefined
    55. * @param {*} arr
    56. */
    57. minOfArray: function (arr) {
    58. if (arr.length === 0) {
    59. return;
    60. }
    61. var min = arr[0];
    62. for (var i = 1; i < arr.length; i++) {
    63. if (arr[i] < min) {
    64. min = arr[i];
    65. }
    66. }
    67. return min;
    68. },
    69. /**
    70. * 判断一个数组是不是稀松数组
    71. * @param {*} arr
    72. */
    73. hasEmptyInArray: function (arr) {
    74. // 稀松数组的特点:下标连续
    75. for (var i = 0; i < arr.length; i++) {
    76. if (!(i in arr)) {
    77. return true;
    78. }
    79. }
    80. return false;
    81. },
    82. /**
    83. * 判断某年是不是闰年
    84. * @param {*} year
    85. */
    86. isLeap: function (year) {
    87. // 4年一闰,百年不闰;400年一闰
    88. return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
    89. },
    90. /**
    91. * 得到某年某月的天数
    92. * @param {*} year
    93. * @param {*} month
    94. */
    95. getDays: function (year, month) {
    96. if (month === 2) {
    97. return this.isLeap(year) ? 29 : 28;
    98. }
    99. else if (month < 8 && this.isOdd(month) || month >= 8 && !this.isOdd(month)) {
    100. return 31;
    101. }
    102. else {
    103. return 30;
    104. }
    105. },
    106. /**
    107. * 得到数组中出现频率最高的数字或字符串和频率
    108. * 返回一个对象
    109. * @param {*} arr
    110. */
    111. getTopFreqInArray: function (arr) {
    112. var records = {}; //记录出现频率
    113. for (var i = 0; i < arr.length; i++) {
    114. var n = arr[i];
    115. if (records[n]) {
    116. records[n]++;
    117. }
    118. else {
    119. records[n] = 1;
    120. }
    121. }
    122. var result; //记录最终结果的对象
    123. for (var prop in records) {
    124. if (!result || records[prop] > result.frequency) {
    125. result = {
    126. number: prop,
    127. frequency: records[prop]
    128. };
    129. }
    130. }
    131. return result;
    132. },
    133. /**
    134. * 给指定的数组升序排序
    135. * @param {*} arr
    136. * @param {Function} compare 比较大小,
    137. * 该函数有两个参数,代表数组中的两个元素,
    138. * 该函数返回一个数字,如果是正数,则第一个元素比第二个元素大,
    139. * 如果是0,则相等,
    140. * 如果是负数,则第一个元素比第二个元素小
    141. */
    142. sort: function (arr, compare) {
    143. if (!compare) {
    144. compare = function (a, b) {
    145. if (a > b) {
    146. return 1;
    147. }
    148. else if (a === b) {
    149. return 0;
    150. }
    151. else {
    152. return -1;
    153. }
    154. }
    155. }
    156. for (var i = 1; i < arr.length; i++) {
    157. for (var j = 0; j < arr.length - i; j++) {
    158. //比较arr[j] 和 arr[j+1]
    159. if (compare(arr[j], arr[j + 1]) > 0) {
    160. //交换
    161. var temp = arr[j];
    162. arr[j] = arr[j + 1];
    163. arr[j + 1] = temp;
    164. }
    165. }
    166. }
    167. },
    168. /**
    169. * 筛选数组
    170. * @param {*} arr
    171. * @param {Function} callback 回调函数,接收两个参数,
    172. * 分别表示数组的某一项和其下标,返回boolean
    173. * 满足条件返回true,否则返回false
    174. */
    175. filter: function (arr, callback) {
    176. //遍历数组,看每一项是否满足条件
    177. var newArr = [];
    178. for (var i = 0; i < arr.length; i++) {
    179. if (callback(arr[i], i)) {
    180. newArr.push(arr[i]);
    181. }
    182. }
    183. return newArr;
    184. },
    185. /**
    186. * 从指定的数组中,查找第一个满足条件的元素,如果没有找到,返回undefined
    187. * @param {*} arr
    188. * @param {*} callback 回调函数,接收两个参数,
    189. * 分别表示数组的某一项和其下标,返回boolean
    190. * 满足条件返回true,否则返回false
    191. */
    192. find: function (arr, callback) {
    193. for (var i = 0; i < arr.length; i++) {
    194. if (callback(arr[i], i)) {
    195. return arr[i];
    196. }
    197. }
    198. },
    199. /**
    200. * 按照指定的条件,得到某个数组中满足条件的元素数量
    201. * @param {*} arr
    202. * @param {*} callback 回调函数,接收两个参数,
    203. * 分别表示数组的某一项和其下标,返回boolean
    204. * 满足条件返回true,否则返回false
    205. */
    206. count: function (arr, callback) {
    207. var num = 0;
    208. for (var i = 0; i < arr.length; i++) {
    209. if (callback(arr[i], i)) {
    210. num++;
    211. }
    212. }
    213. return num;
    214. },
    215. /**
    216. * 得到一个最小值到最大值之间的随机整数
    217. * @param {*} min 最小值
    218. * @param {*} max 最大值
    219. */
    220. getRandom: function (min, max) {
    221. return Math.floor(Math.random() * (max + 1 - min) + min);
    222. },
    223. /**
    224. * 根据出生年月日,计算年龄
    225. * @param {*} year
    226. * @param {*} month
    227. * @param {*} day
    228. */
    229. getAge: function (year, month, day) {
    230. //得到当前日期
    231. var now = new Date();
    232. var dec = now.getFullYear() - year;
    233. //处理闰年
    234. if (month === 2 && day === 29 && !this.isLeap(now.getFullYear())) {
    235. day = 28;
    236. }
    237. //得到今年的生日
    238. var birthdayThisYear = new Date(now.getFullYear(), month - 1, day);
    239. if (birthdayThisYear > now) {
    240. dec--;
    241. }
    242. return dec;
    243. },
    244. getDateString: function (date) {
    245. var year = date.getFullYear().toString().padStart(4, "0");
    246. var month = (date.getMonth() + 1).toString().padStart(2, "0");
    247. var day = date.getDate().toString().padStart(2, "0");
    248. var hour = date.getHours().toString().padStart(2, "0");
    249. var minute = date.getMinutes().toString().padStart(2, "0");
    250. var second = date.getSeconds().toString().padStart(2, "0");
    251. return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
    252. }
    253. }