U.MS.js 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  1. /*
  2. 一、此js主要扩展了String,Number,Array,Object,Guid,json,Date等七种数据类型,还有一些html5的数据类型,但暂未使用,此js需要立即执行的区域比较多。
  3. 没有对以下数据类型进行扩展 function Boolean null undefined。
  4. 二、此js包含了正则处理
  5. */
  6. Namespace.register("U.MS");
  7. //#region 正则方法区域
  8. U.MS.browser = /(msie|firefox|chrome|ipad|iphone|safari|opera|version|rv).*?([\d.]+)/; //区分浏览器正则
  9. U.MS.browsers = {
  10. msie: /msie ([\d.]+)|(trident)\/([\d.]+)/, //ie正则
  11. firefox: /firefox\/([\d.]+)/, //firfox正则
  12. chrome: /chrome\/([\d.]+)/, //chrome正则
  13. opera: /opera.([\d.]+)/, //opera正则
  14. safari: /version\/([\w.]+).*(safari)/ //safari正则
  15. };
  16. U.MS.Event = /\[object (Keyboard|Mouse|Focus|Wheel|Composition|Storage|MS|)Event(Obj|)\]/; //判断是否为event
  17. U.MS.Guid = /^[a-fA-F0-9]{8}(-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}$/; //判断是否为Guid
  18. U.MS.English = /^[A-Za-z]+$/; //是否为英文
  19. U.MS.RNum = /\d+/g; //数字浮点等
  20. U.MS.Number = /^\d+$/; //整数
  21. U.MS.Num = /^(-?\d+)(\.\d+)?$/; //浮点
  22. U.MS.EN = /^([a-zA-Z0-9_\-]+)$/; //css样式规则
  23. U.MS.Url = /^\w+\:\/\/([\w+]).*/; //是否是有效链接
  24. U.MS.FileName = /^([a-zA-Z0-9\s\._-]+)$/; //文件名判断
  25. U.MS.ZWFileName = /^[0-9a-zA-Z\u4e00-\u9fa5\._-]{1,40}\\*$/; //文件名判断
  26. U.MS.PBrief = /^.{0,100}$/; //判断是否为有效的签名
  27. U.MS.FFZF = /^(\w|-|[\u4E00-\u9FA5])*$/; //中文字符下划线
  28. U.MS.ChineseIdCard = /\d{17}[\d|X]|\d{15}/; //身份证
  29. U.MS.TelephoneNumber = /^1[0-9]{10}$/; //电话号码
  30. U.MS.Email = /^\w+([_+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; //邮箱
  31. U.MS.TrueName = /^[\u4e00-\u9fa5]{1,20}$|^[a-zA-Z]{1,20}$/; //真实姓名
  32. U.MS.UserName = /^\S{1,25}$/; //用户名
  33. U.MS.NickName = /^[0-9a-zA-Z\u4e00-\u9fa5_-]{1,40}\\*$/; //昵称
  34. U.MS.PassWord = /^[^\u4E00-\u9FA5\uF900-\uFA2D]{6,20}$/; //密码
  35. U.MS.Visa = /^[45]\d{15}$/; //银行卡号
  36. U.MS.rgb = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/ //rgb颜色判断
  37. //#endregion
  38. //#region 字符串处理
  39. /**
  40. * 序列化json为字符串
  41. *
  42. * @param {object 、 array} 需要序列化对象
  43. * @returns {string} json为字符串
  44. 注释:在写api时需要获取数据库返回值并转化为可识别字符串时经常用到。可精简名字,写成好的api
  45. */
  46. U.MS.jsonToStr = function (obj) {
  47. var i, _type = false,
  48. _str = "",
  49. _type = typeof (obj); //获取类型
  50. //开始序列化
  51. if (obj == null) { }
  52. else {
  53. obj = obj.valueOf(); //获取值 同时类型也为对应
  54. if ("boolean,number".indexOf(_type) > -1) {//bool和number类型转化
  55. _str = obj.toString();
  56. }
  57. else if (_type == "string") {//json处理字符串时需要加上 "\""符号
  58. _str = "\"" + obj + "\"";
  59. }
  60. else if (U.M.GetType(obj) == "array") { //数组处理
  61. _str = "["; for (i = 0; i < obj.length; i++) {
  62. _str += U.MS.jsonToStr(obj[i]) + ((i < obj.length - 1) ? "," : "")
  63. }; _str += "]"; return _str
  64. }
  65. else {//object处理
  66. _str = "{";
  67. for (i in obj) {
  68. if (obj.hasOwnProperty(i)) {
  69. (_str.length > 1) && (_str += ","); _str += "\"" + i + "\":" + U.MS.jsonToStr(obj[i]);
  70. }
  71. } _str += "}";
  72. }
  73. return _str;
  74. }
  75. }
  76. //---------------------------------- 字符串处理-------------------------------------
  77. U.M.String = {
  78. //场景:制作编辑器word,excel,txt时,把符号"'"转义成"\'",把符号"""转义成"\"".
  79. //作用,把符号"'"转义成"\'",把'张三'存入数据库,会报错,符号'''会在存储过程执行时报错,此时需要把"'"转成"\'",转换后的结果是"\'张三\'"
  80. //例:exec 存储过程 ''param'',转义为exec 存储过程 '\'param\''
  81. //把符号"""转义成"\"",把"张三"存入数据库,会报错,符号'"'会在存储过程执行时报错,此时需要把"""转成"\"",转换后的结果是"\"张三\""
  82. //例:exec 存储过程 ""param"",转义为exec 存储过程 "\"param\""
  83. escapeQuotes: function () {
  84. return this.replace(/'/ig, '\'').replace(/"/ig, "\""); //字符串的形式输出
  85. },
  86. count: function () { //获取字符串长度
  87. return this.substrU(); //调用SubstrU() 获取字符串长度
  88. },
  89. //截取字符串在制定的长度内
  90. substrU: function (start, end) {
  91. var i, _UTF, _UN = 0, _UMS = "";
  92. (end == null && start != null) && (end = start, start = 0); //参数只有一个的情况 start=0起点设置0 end=start把start当做截取字符串的终点
  93. _UTF = (start == null && end == null); //没有参数情况 _UTF=true
  94. for (i = 0; i < this.length; i++) {
  95. _UN += this.charCodeAt(i) < 255 ? 1 : 2; //非常规字符判断长度为2 常规则1
  96. if (_UN < start) { continue; } //当前长度小于起点则 continue
  97. if (_UN <= end || _UTF) {//当前长度小于 终点
  98. _UMS += this.charAt(i); //获取字符串的第i个
  99. continue;
  100. }
  101. break; //不符合if时 break
  102. }
  103. return (_UTF ? _UN : _UMS); //判断参数是否为空 为空返回长度 否则返回截取的字符串
  104. },
  105. //jsstring: function () { //json string
  106. // return this.replace(/\r\n/g, "\\r\\n").replace(/\n/g, "\\n").replace(/\"/g, "\\\""); //把 \r\n转成 \\r\\n \n转成\\n \"转成\\\"
  107. //},
  108. //SubstrN: function (UN) { //判断是否在指定的长度内,
  109. // return this.substrU(0, UN) == this; //用SubstrU截取0-UN的字符串 判断是否等于原字符串
  110. //},
  111. isStrNull: function () { //判断是否为空字符串
  112. return this.trim() == ""; //用trim 去除所有空白字符再判断是否等于 ""
  113. },
  114. //文本换行替换成页面换行,把\r\n 换成<br/>
  115. replaceRnToBr: function () {
  116. return this.replace(/\r\n/g, "<br />"); //把\r\n 换成<br/>
  117. },
  118. //成页面换行替换成文本换行,把<br/>换成\r\n
  119. replaceBrToRn: function () {
  120. return this.replace(/<(BR)[^<>]*>/ig, "\r\n"); // 把<br/>换成\r\n
  121. },
  122. removeP: function () { //去除P标签
  123. return this.replace(/<(p)[^<>]*>/ig, ""); //把<p></p> 去掉
  124. },
  125. removeBr: function () { //去除BR标签
  126. return this.replace(/<(BR)[^<>]*>/ig, ""); //把<br /> 去掉
  127. },
  128. removeRn: function () { //去除\r\n标签
  129. return this.replace(/\r\n/g, ""); //把\r\n 去掉
  130. },
  131. replaceBrAndBlank: function () { //把<br />转换为 \r\n并把空格"&nbsp"转换为"",应用场景在哪里?
  132. return this.replaceBrToRn().replace(/&nbsp;/g, '');
  133. },
  134. //判断用户是否在div可编辑区域里面输入了内容。
  135. isHtmlNull: function () { //移除<br />标签,移除P标签,去除所有空格。当用户发帖时需要判断用户是否输入了文字图片,可以用此函数判断用户是否输入了内容。在div可编辑时需要用此函数。
  136. return this.removeBr().removeP().trim() != ""; //
  137. },
  138. //把字符串中的&lt &gt 分别转换成 < >
  139. replaceLtAndGt: function () {
  140. return this.replace(/&lt;/g, "<").replace(/&gt;/g, ">"); //所有&lt &gt 分别转换成 < >
  141. },
  142. //把字符串中的 < >分别转换成&lt &gt
  143. replaceAngleBrackets: function () { //把字符串中的 < >分别转换成&lt &gt
  144. return this.replace(/</g, "&lt;").replace(/>/g, "&gt;"); //所有&lt &gt 分别转换成 < >
  145. },
  146. //应用:从数据库取出的html代码会直接显示在页面中,为了让js,css等文字以文字的形式显示,而不是植入到页面中不显示,所以需要转义。
  147. //HTML字符转化为ASCLL码.把字符串中的 < >分别转换成&lt &gt ,把"'"转换为"&#39;",把"""转换为"&quot;",把
  148. //注释:/&(?!#?[a-zA-Z0-9]+;)/g, "&amp;"暂时不知道什么意思。
  149. replaceHtmlSign: function () {
  150. return this.replace(/&(?!#?[a-zA-Z0-9]+;)/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/'/g, "&#39;").replace(/"/g, "&quot;");
  151. },
  152. replaceDoubleToAngleBrackets: function () { //html字符可输出
  153. return this.replace(/\《/g, "<").replace(/\》/g, ">"); //所有《》转换为<>
  154. },
  155. replaceAngleToDoubleBrackets: function () {//中文括号
  156. return this.replace(/\</g, "《").replace(/\>/g, "》"); // 所有<>转换为《》
  157. },
  158. trim: function (UST) {//去除所有空格,用于发帖时标题内容是否为空的判断,创建文件夹时输入文件夹名时的判断。
  159. return this.replace(/\ |\ |\s+|\n|\r|\t/g, UST || ""); //去除空白符号、\t、\s、\r、\n
  160. },
  161. lTrim: function () { //去除左边空格
  162. return this.replace(/(^\s*)/g, "");
  163. },
  164. rTrim: function () { //去除右边边空格
  165. return this.replace(/(\s*$)/g, "");
  166. },
  167. addPreSpace: function (n) { //字符串前面追加n个空格,用于IDE编辑器环境前面空四格
  168. var i, k = "";
  169. for (i = 0; i < n; i++)
  170. k += " ";
  171. return k + this;
  172. },
  173. insertString: function (str, n) { //指定位置插入字符串
  174. //调用substr截取字符串 加上插入的字符 再加上 把原字符串删除前UN个字符的字符串
  175. var _pre = this.substr(0, n);
  176. var _back = this.substr(n, this.length);
  177. return _pre + str + _back;
  178. },
  179. //指定位置插入省略号, 常见于文章标题过长、文件夹名称过长,在显示时后面的字符以省略号代替
  180. addEllipsis: function (n) { //省略号
  181. var _str = this.substrU(0, n); //调用SubstrU 截取字符串
  182. if (_str != this) {
  183. _str = _str + "...";
  184. }
  185. //当修改String的原型时,会把字符串string替换为object的str,所以需要用valueOf()方法转换为字符串的string. Object对象的格式类似 String {"asdasd"}
  186. return _str.valueOf(); //判断_str是否为原字符串 不是的话返回_str加上...
  187. },
  188. //字符串转化成number
  189. toInt: function () {
  190. var _UTV = this.valueOf(), _UMS = _UTV.match(/^(-|\+)?\d+/g);
  191. return _UMS && _UMS.length == 1 ? Number(_UMS[0]) : _UTV;
  192. },
  193. //把原字符串source换成目标字符串target
  194. replaceStr: function (source, target) {
  195. return this.replace(new RegExp(source, "gm"), target); //把原字符串source换成目标字符串target
  196. },
  197. parseJSON: function () { //string 转 json对象
  198. var _UJE = null, _UST = this;
  199. try {
  200. _UJE = eval("0,(" + _UST + ")");
  201. } catch (e) { }
  202. return (_UJE == null ? _UST : _UJE).valueOf();
  203. },
  204. capitalizeFirstLetter: function () { //首字母大写
  205. return this.replace(/\b(\w)|\s(\w)/g, function (UAE) { return UAE.toUpperCase(); });
  206. },
  207. //回车换行替换成换行 并返回按照\n拆分出的数组
  208. SplitRN: function () {
  209. return this.replace(/\r\n/g, "\n").split("\n"); //把\r\n替换成\n 并且根据\n把字符串分成数组
  210. },
  211. //根据符号"<",">"把html字符串拆分成数组,适合于IDE编辑器
  212. ////增加一个拆分html编码为字符串数组的操作,用于编辑器的换行,定义到主项目中
  213. //拆分HTML编码,适合于编辑器,不止是拆分html编码,同时还需要把中间的文字提出出来,例如javascript代码,div中间的文字等。
  214. SplitAngleBrackets: function (h) {
  215. var i, s, a = [];
  216. for (i = 0; i < h.length; i++) {
  217. if (h[i] == "<")
  218. s = i;
  219. if (h[i] == ">")
  220. a.push(h.substring(s, i + 1));
  221. };
  222. return a;
  223. },
  224. //过滤html标签留下纯文本,不保留任何格式
  225. htmlToText: function () { //过滤HTML标签留下纯文本
  226. return String(this).replace(/(<(.[^>]*)>)/g, "");
  227. },
  228. //过滤html标签留下纯文本,但保留换行符号
  229. htmlToTextRn: function () {
  230. return this.replace(/(<(.[^>]*)>)/g, function (str) {
  231. return (/(<\/(div|DIV|p|P)([|^>]*)>)|<(BR)[^<>]*>/g.test(str)) ? "\r\n" : "";
  232. });
  233. }
  234. };
  235. //#endregion
  236. //#region 数字Number
  237. U.M.Number = {
  238. //数字转换成货币的格式 100000 = 10,000
  239. formatMoney: function () {
  240. var _split; //
  241. var _arr = [];
  242. var _str = this.toString();
  243. while (_str) { //循环拆分
  244. _split = _str.length - 3;
  245. //unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
  246. _arr.unshift(_str.substr(_split < 0 ? 0 : _split));
  247. _str = _str.substr(0, _split);
  248. }
  249. return _arr.join(",");
  250. },
  251. //数字前面补零
  252. prefixInteger: function (n) {
  253. return (this < 10 ? "0" + this : this).valueOf(); //小于10 补零
  254. //Array(n)创建n位数组,join(0)以0作为分隔符,
  255. return (Array(n).join(0) + this).slice(-n);
  256. },
  257. //把角度转换成弧度,
  258. toRadians: function () { //返回圆弧率
  259. return this * Math.PI / 180; //PI即圆周率,Math.PI/180*t是将t把角度转换成弧度.缺少应用场景
  260. }
  261. };
  262. //#endregion
  263. //#region 数组处理
  264. /**
  265. * 判断是否为数组,//ie10以下浏览器不支持Array.isArray。使用return Object.prototype.toString.call(arr) === "[object Array]";做兼容。U.M.Array是为了添加Array的原型方法,而Array.isArray不是原型方法,所以没有放到U.M.Array中。
  266. *
  267. * @param {array} 需要判断的类型
  268. * @returns {bool} 返回真假
  269. */
  270. Array.isArray = Array.isArray || function (arr) {
  271. return Object.prototype.toString.call(arr) === "[object Array]";
  272. }
  273. //数组初始化类
  274. U.M.Array = {
  275. /**
  276. * 判断有否有内容包含在该数组中的位置
  277. *
  278. * @param {string、number} 需要查找的值indexOf
  279. * @returns {int} -1 >-1 -1 就是数组不存在 >-1就是位置
  280. */
  281. indexOf: Array.prototype.indexOf || function (val, startpoint) {
  282. var i = startpoint || 0,
  283. j;
  284. //循环数组,获取数组的值
  285. for (; i < this.length; i++) {
  286. //在数组中查找制定的值,如果值匹配数组中的其中一个,那么返回该数组所在的位置
  287. if (this[i] == val) {
  288. return i;
  289. }
  290. }
  291. //如果没有找到制定的位置,那么就直接返回-1
  292. return -1;
  293. },
  294. //对象object在数组中的位置
  295. //参数:object 形如{"name":"张三"}
  296. objIndexOf: function (obj) {
  297. var i,
  298. j,
  299. _isfind;
  300. for (i = 0; i < this.length; i++) {
  301. _isfind = false; //默认没有找到位置。
  302. //循环所有的obj里面的key和value,匹配所有的key和value都正确的,找到第一个匹配成功的位置
  303. for (j in obj) {
  304. //根据key匹配了指定的值,那么设置为true
  305. if (this[i][j] == obj[j]) {
  306. _isfind = true;
  307. }
  308. //如果根据key匹配指定的值错误,那么解决forin循环直接设置为false
  309. else {
  310. _isfind = false;
  311. break;
  312. }
  313. }
  314. //如果上面的obj判断全部正确,那么返回所在的位置,否则返回-1;
  315. if (_isfind) {
  316. return i;
  317. }
  318. }
  319. //如果没有找到制定的位置,那么就直接返回-1
  320. return -1;
  321. },
  322. /**
  323. * 移除数组里相同的值, 类似[element,elment,elment,element],或者[1,2,3,4,3,2],或者["张三","李四","张三","","王五"]
  324. *
  325. * @param {string} 判断字段
  326. * @param {string} 原数组
  327. * @returns 删除的原元素本身
  328. */
  329. unique: function () { //移除数组里相同的值
  330. //将数组的值作为对象的属性,通过对象的属性值来判断数组是否重复,若该项不重复则给对象对应属性值赋为true,便于之后的判断,并将数据项加入结果集中
  331. var result = [];
  332. var obj = {};
  333. for (var i = 0; i < this.length; i++) {
  334. if (!obj[this[i]]) {
  335. result.push(this[i]);
  336. obj[this[i]] = true;
  337. }
  338. }
  339. return result
  340. },
  341. //以下几个函数是做浏览器兼容的,系统本身支持这些函数,但有些浏览器不支持,为了使所有浏览器都支持,则定义以下几个兼容函数。
  342. //方法对数组的每个元素执行一次提供的函数。
  343. //参数一:callback 为数组中每个元素执行的函数,该函数接收三个参数:currentValue(当前值) 数组中正在处理的当前元素。index(索引)数组中正在处理的当前元素的索引。arrayforEach()方法正在操作的数组。
  344. //参数二:可选参数。当执行回调 函数时用作this的值(参考对象)。
  345. forEach: Array.prototype.forEach || function (cb, thisArg) {//允许object和array使用
  346. var i = 0;
  347. var _length = this.length;
  348. while (i < _length) {
  349. cb.call(thisArg, this[i], i, this);
  350. i++;
  351. }
  352. },
  353. /**
  354. * 测试数组的所有元素是否都通过了指定函数的测试。
  355. *
  356. * @param {function} 用来测试每个元素的函数。
  357. * @param {Array} 执行 callback 时使用的 this 值。
  358. * @returns {boolean}
  359. */
  360. every: Array.prototype.every || function (cb, thisArg) {
  361. // return this.forEach(cb, UTI, "every");
  362. var i = 0, b;
  363. var _length = this.length;
  364. while (i < _length) {
  365. b = cb.call(thisArg, this[i], i, this);
  366. if (b == false) {
  367. return b;
  368. }
  369. i++;
  370. }
  371. return true;
  372. },
  373. /**
  374. * 方法测试数组中的某些元素是否通过由提供的函数实现的测试。
  375. *
  376. * @param {function} 用来测试每个元素的回调函数
  377. * @param {Array} 执行 callback 函数时 使用的this 值。
  378. * @returns {boolean}
  379. */
  380. some: Array.prototype.some || function (cb, thisArg) {
  381. var t = Object(this);
  382. var len = t.length;
  383. for (var i = 0; i < len; i++) {
  384. if (i in t && cb.call(thisArg, t[i], i, t))
  385. //为数组中的每一个元素执行一次 callback 函数,如果回调函数返回true的话,则some函数返回true。
  386. return true;
  387. }
  388. return false;
  389. },
  390. /**
  391. * 方法测试数组中的某些元素是否通过由提供的函数实现的测试。
  392. *
  393. * @param {function} 生成新数组元素的函数,使用三个参数:
  394. currentValue callback 的第一个参数,数组中正在处理的当前元素。
  395. @param {int} callback 的第二个参数,数组中正在处理的当前元素的索引。
  396. @param {Array} callback 的第三个参数,map 方法被调用的数组。
  397. * @param {Array} 执行 callback 函数时 使用的this 值。
  398. * @returns {Array} 返回整合过后的新数组
  399. */
  400. map: Array.prototype.map || function (cb, thisArg) {
  401. /*var T, A, k;
  402. // 将O赋值为调用map方法的数组.
  403. var O = Object(this);
  404. //将len赋值为数组O的长度.
  405. var len = O.length;
  406. //如果参数thisArg有值,则将T赋值为thisArg;否则T为undefined.
  407. if (thisArg) {
  408. T = thisArg;
  409. }
  410. //创建新数组A,长度为原数组O长度len
  411. A = new Array(len);
  412. //将k赋值为0
  413. k = 0;
  414. //当 k < len 时,执行循环.
  415. while (k < len) {
  416. var kValue, mappedValue;
  417. //遍历O,k为原数组索引
  418. if (k in O) {
  419. //kValue为索引k对应的值.
  420. kValue = O[k];
  421. // 执行callback,this指向T,参数有三个.分别是kValue:值,k:索引,O:原数组.
  422. mappedValue = callback.call(T, kValue, k, O);
  423. // 返回值添加到新数组A中.
  424. A[k] = mappedValue;
  425. }
  426. // k自增1
  427. k++;
  428. }
  429. //返回新数组A
  430. return A;*/
  431. //定义自增量
  432. var i = 0;
  433. //定义数组长度
  434. var _length = this.length;
  435. //定义新的数组
  436. var arr = [];
  437. //判断传入的cb必须是个'function',若不是返回类型错误提示
  438. if (typeof cb != "function")
  439. throw new TypeError();
  440. //当i<_length时循环
  441. while (i < _length) {
  442. //判断索引是否为原数组的索引
  443. if(i in this){
  444. // 执行callback,this指向thisArg,参数有三个.分别是this[i]:值,i:索引,this:原数组.
  445. arr.push(cb.call(thisArg, this[i], i, this));
  446. }
  447. //i+1
  448. i++;
  449. }
  450. //返回出新的数组
  451. return arr;
  452. },
  453. /**
  454. * 创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
  455. *
  456. * @param {function} 用来测试数组的每个元素的函数。返回true表示保留该元素(通过测试),false则不保留。
  457. * @param {Array} 可选。执行 callback 时的用于 this 的值。
  458. * @returns {Array} 一个新的通过测试的元素的集合的数组
  459. */
  460. filter: Array.prototype.filter || function (cb, thisArg) {
  461. /*var t = Object(this);
  462. var len = t.length;
  463. var res = [];
  464. for (var i = 0; i < len; i++) {
  465. if (i in t) {
  466. var val = t[i];
  467. if (cb.call(thisArg, val, i, t))
  468. //判断是否符合回调函数中的条件,如果符合则添加到新数组中
  469. res.push(val);
  470. }
  471. }
  472. return res;*/
  473. //定义自增量
  474. var i = 0;
  475. //定义数组长度
  476. var _length = this.length;
  477. //定义新的数组
  478. var arr = [];
  479. //判断传入的cb必须是个'function',若不是返回类型错误提示
  480. if (typeof cb != "function")
  481. throw new TypeError();
  482. while (i < _length) {
  483. //如果i是原数组的索引,执行call.参数有三个.分别是this[i]:值,i:索引,this:原数组.
  484. if (i in this && cb.call(thisArg, this[i], i, this))
  485. arr.push(this[i]);
  486. i++;
  487. }
  488. return arr;
  489. },
  490. /* mdn中没有的Array方法
  491. reject: function (cb, UTI) { //过滤真元素
  492. return this.forEach(cb, UTI, "reject");
  493. },
  494. */
  495. /**
  496. * 返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。
  497. *
  498. * @param {function} 针对数组中的每个元素, 都会执行该回调函数, 执行时会自动传入下面三个参数:
  499. element 当前元素。
  500. index 当前元素的索引。
  501. array 调用findIndex的数组。
  502. * @param {Array} 可选。执行 callback 时的用于 this 的值。
  503. * @returns {int} 用来判断是否满足测试函数中的第一个元素的值 没有返回-1
  504. */
  505. findIndex: Array.prototype.findIndex || function (predicate) {
  506. /*var o = Object(this);
  507. var len = o.length;
  508. var thisArg = arguments[1];
  509. var k = 0;
  510. while (k < len) {
  511. var kValue = o[k];
  512. if (predicate.call(thisArg, kValue, k, o)) {
  513. //如果找到这个元素的话则返回k
  514. return k;
  515. }
  516. k++;
  517. }
  518. //没有找到该元素则返回-1
  519. return -1;*/
  520. //定义自增量
  521. var i = 0;
  522. //定义数组长度
  523. var _length = this.length;
  524. //判断传入的cb必须是个'function',若不是返回类型错误提示
  525. if (typeof predicate != "function")
  526. throw new TypeError();
  527. while (i < _length) {
  528. //参数有三个.分别是this[i]:值,i:索引,this:原数组.
  529. if (predicate(this[i], i, this))
  530. //如果找到这个元素的话则返回i
  531. return i;
  532. i++;
  533. }
  534. return -1;
  535. },
  536. /**
  537. * 方法返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找,从 fromIndex 处开始。
  538. *
  539. * @param {element} 被查找的元素。
  540. * @param {int} 从此位置开始逆向查找。默认为数组的长度减 1,即整个数组都被查找。如果该值大于或等于数组的长度,则整个数组会被查找。如果为负值,将其视为从数组末尾向前的偏移。即使该值为负,数组仍然会被从后向前查找。如果该值为负时,其绝对值大于数组长度,则方法返回 -1,即数组不会被查找。
  541. * @returns {int} 数组中最后一个元素的索引,如未找到返回-1
  542. */
  543. lastIndexOf: Array.prototype.lastIndexOf || function (searchElement, fromIndex) {
  544. var n, k,
  545. t = Object(this),
  546. len = t.length;
  547. if (len === 0) {
  548. //如果数组的长度为零的话直接返回-1
  549. return -1;
  550. }
  551. n = len - 1;
  552. if (arguments.length > 1) {
  553. n = Number(arguments[1]);
  554. if (n != n) {
  555. n = 0;
  556. }
  557. else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) {
  558. n = (n > 0 || -1) * Math.floor(Math.abs(n));
  559. }
  560. }
  561. for (k = n >= 0
  562. ? Math.min(n, len - 1)
  563. : len - Math.abs(n); k >= 0; k--) {
  564. if (k in t && t[k] === searchElement) {
  565. // 如果有等于参数1 的元素,返回该元素
  566. return k;
  567. }
  568. }
  569. //如果上述查找没有符合条件的元素,返回-1
  570. return -1;
  571. //定义结束位置
  572. /* var endLength = !isNaN(parseFloat(UTI)) && isFinite(UTI) ? UTI : 0;
  573. //定义自减量
  574. var i = this.length - 1;
  575. while (i >= endLength) {
  576. if (USE == this[i])//如果等于就返回i索引
  577. return i;
  578. i--;
  579. }
  580. //没符合条件,返回-1
  581. return -1;*/
  582. },
  583. /* mdn Array方法中无此方法 */
  584. /*
  585. sample: function (UIE, UDE) { //获取一组随机数
  586. UDE = UDE || this; var _USE = [], _UL = UDE.length; UIE = UIE || 1;
  587. for (i = 0; (i < _UL && i < UDE.length); i++) { _USE.push(UDE[U.P.getRandom(_UL)]); }
  588. },*/
  589. /**
  590. * 用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。
  591. *
  592. * @param {int} 用来填充数组元素的值。
  593. * @param {int} 起始索引,默认值为0。
  594. * @param {int} 终止索引,默认值为 this.length。
  595. * @returns {Array} 修改后的数组。
  596. */
  597. fill: Array.prototype.fill || function (value) {
  598. var O = Object(this);
  599. //转换成无符号的整数
  600. var len = O.length;
  601. var start = arguments[1];
  602. var relativeStart = start;
  603. //判断start是否小于零,并将相应的值赋予变量
  604. var k = relativeStart < 0 ?
  605. Math.max(len + relativeStart, 0) :
  606. Math.min(relativeStart, len);
  607. var end = arguments[2];
  608. var relativeEnd = end === undefined ?
  609. len : end;
  610. //判断end是否小于零,并将相应的值赋予变量
  611. var _final = relativeEnd < 0 ?
  612. Math.max(len + relativeEnd, 0) :
  613. Math.min(relativeEnd, len);
  614. //对数组进行填充
  615. while (k < _final) {
  616. O[k] = value;
  617. k++;
  618. }
  619. return O;
  620. },
  621. /**
  622. * 浅复制数组的一部分到同一数组中的另一个位置,并返回它,而不修改其大小。
  623. *
  624. * @param {int} 0 为基底的索引,复制序列到该位置。如果是负数,target 将从末尾开始计算。
  625. * @param {int} 0 为基底的索引,开始复制元素的起始位置。如果是负数,start 将从末尾开始计算。
  626. * @param {int}0 为基底的索引,开始复制元素的结束位置。copyWithin 将会拷贝到该位置,但不包括 end 这个位置的元素。如果是负数, end 将从末尾开始计算。
  627. * @returns {Array} 改变了的数组。
  628. */
  629. copyWithin: Array.prototype.copyWithin || function (target, start, end) { //拷贝对象
  630. var O = Object(this);
  631. var len = O.length;
  632. //转换成无符号整数
  633. var relativeTarget = target;
  634. //判断target是否小于0,并将判断之后的值赋予变量
  635. var to = relativeTarget < 0 ?
  636. Math.max(len + relativeTarget, 0) :
  637. Math.min(relativeTarget, len);
  638. //start转换成无符号整数
  639. var relativeStart = start;
  640. //判断start是否小于0,并将判断之后的值赋予变量
  641. var from = relativeStart < 0 ?
  642. Math.max(len + relativeStart, 0) :
  643. Math.min(relativeStart, len);
  644. var end = arguments[2];
  645. var relativeEnd = end === undefined ? len : end >> 0;
  646. //判断end是否小于0,并将判断之后的值赋予变量
  647. var _final = relativeEnd < 0 ?
  648. Math.max(len + relativeEnd, 0) :
  649. Math.min(relativeEnd, len);
  650. var count = Math.min(_final - from, len - to);
  651. var direction = 1;
  652. if (from < to && to < (from + count)) {
  653. direction = -1;
  654. from += count - 1;
  655. to += count - 1;
  656. }
  657. //循环进行数组操作
  658. while (count > 0) {
  659. if (from in O) {
  660. O[to] = O[from];
  661. } else {
  662. delete O[to];
  663. }
  664. from += direction;
  665. to += direction;
  666. count--;
  667. }
  668. //返回复制过后的数组
  669. return O;
  670. },
  671. /*该特性是非标准的,请尽量不要在生产环境中使用它!*/
  672. //toSource: function () { return JSON.stringify(this); },
  673. /* mdn Array方法中无此方法 */
  674. //ArrayToString: function () { return JSON.stringify(this); }, //数组转换为字符串,在写api时获取后台返回的值时经常用到。
  675. /* IE无法兼容此方法 */
  676. /*keys: Array.prototype.keys || function () {
  677. var _UME = function (UDE) { this.i = 0; this.e = UDE; }
  678. _UME.prototype = {
  679. next: function () { //迭代
  680. return { value: this.i++, done: this.i >= this.e.length }
  681. }
  682. }
  683. return new _UME(this);
  684. },*/
  685. /**
  686. * 返回一个新的Array Iterator对象,该对象包含数组中每个索引的键/值对。
  687. *
  688. * @returns {object} 一个新的 Array 迭代器对象。
  689. */
  690. /* IE无法兼容此方法 */
  691. //entries: Array.prototype.entries || function () { }
  692. //一维数组深拷贝是用concat()函数。
  693. //多维数组深度拷贝函数
  694. //重玩本关是一个难点,难度在于三维数组的拷贝,只复制地址,不复制值,这意味着通关后的数组再也回不到初始化时的数组,也就实现不了重玩本关的功能。
  695. //javascrit数组数据类型提供了slice(0)和concat()函数实现数组的深拷贝,但只局限于一维数组,在二维,三维,四维中不起作用。
  696. //为了解决此问题,特提供深度拷贝函数解决此问题。
  697. //递归的适合于二维数组以上的所有维度的深拷贝。
  698. deepCopy: function () {
  699. var _newarr = [];
  700. for (i = 0; this.length; i++) {
  701. if (Array.isArray(this[i])) {
  702. //深拷贝
  703. deepCopy(this[i]);
  704. }
  705. else {
  706. return this.concat();
  707. }
  708. }
  709. return _newarr;
  710. }
  711. };
  712. //#endregion
  713. //#region Guid
  714. /**
  715. * 自定义Guid 类型
  716. 默认情况下我们给guid返回 空Guid
  717. */
  718. window.Guid = U.M.Guid = {
  719. //生成Guid
  720. newGuid: function () {
  721. var _UN, i, _UGID = "";
  722. for (i = 0; i < 32; i++) {
  723. _UGID += Math.floor(Math.random() * 16).toString(16); //随机0 - 16 的数字 转变为16进制的字符串
  724. _UN = Math.floor((i - 7) / 4); //计算 (i-7)除4
  725. if (_UN > -1 && _UN < 4 && (i == (7 + 4 * _UN))) { //会使guid中间加 "-" 形式为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  726. _UGID += "-";
  727. }
  728. }
  729. return _UGID;
  730. },
  731. //空Guid
  732. emptyGuid: US.NU,
  733. // 返回一串无 "-" 的Guid Dash翻译为破折号
  734. guidNoDash: function () {
  735. return Guid.newGuid().replace(/-/g, "");
  736. },
  737. //测试是不是正确的Guid 返回结果为 true 或 false
  738. IsGuid: function (UGID) {
  739. return U.MS.Guid.test(UGID);
  740. }
  741. }
  742. //#endregion