{"remainingRequest":"D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\eslint-loader\\index.js??ref--13-0!D:\\jenkins\\workspace\\cssc-fvue\\src\\hotent-ui-util.js","dependencies":[{"path":"D:\\jenkins\\workspace\\cssc-fvue\\src\\hotent-ui-util.js","mtime":1667804639540},{"path":"D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\eslint-loader\\index.js","mtime":499162500000}],"contextDependencies":[],"result":["import \"core-js/modules/es7.object.get-own-property-descriptors\";\nimport \"core-js/modules/es6.array.from\";\nimport \"core-js/modules/es6.set\";\nimport \"core-js/modules/es6.string.iterator\";\nimport \"core-js/modules/es6.map\";\nimport \"core-js/modules/es6.array.find-index\";\nimport \"core-js/modules/es6.regexp.constructor\";\nimport \"core-js/modules/es6.regexp.match\";\nimport \"core-js/modules/es6.number.parse-int\";\nimport _toConsumableArray from \"D:/jenkins/workspace/cssc-fvue/node_modules/@babel/runtime/helpers/esm/toConsumableArray\";\nimport \"core-js/modules/es6.number.is-integer\";\nimport \"core-js/modules/es6.number.constructor\";\nimport \"core-js/modules/es6.regexp.split\";\nimport _defineProperty from \"D:/jenkins/workspace/cssc-fvue/node_modules/@babel/runtime/helpers/esm/defineProperty\";\nimport \"core-js/modules/es7.object.values\";\nimport _typeof from \"D:/jenkins/workspace/cssc-fvue/node_modules/@babel/runtime/helpers/esm/typeof\";\nimport \"core-js/modules/es6.function.name\";\nimport \"core-js/modules/web.dom.iterable\";\nimport \"core-js/modules/es6.object.keys\";\nimport \"core-js/modules/es6.regexp.to-string\";\nimport \"core-js/modules/es6.regexp.replace\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nvar _interopRequireDefault = require(\"@babel/runtime-corejs2/helpers/interopRequireDefault\");\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime-corejs2/helpers/typeof\"));\n\nvar utils = {\n uuid: function uuid(hasHyphen) {\n return (hasHyphen ? 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' : 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx').replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0;\n var v = c == 'x' ? r : r & 0x3 | 0x8;\n return v.toString(16);\n });\n },\n deepMerge: function (_deepMerge) {\n function deepMerge(_x, _x2) {\n return _deepMerge.apply(this, arguments);\n }\n\n deepMerge.toString = function () {\n return _deepMerge.toString();\n };\n\n return deepMerge;\n }(function (target, merged) {\n for (var key in merged) {\n if (target[key] && (0, _typeof2[\"default\"])(target[key]) === 'object') {\n deepMerge(target[key], merged[key]);\n continue;\n }\n\n if ((0, _typeof2[\"default\"])(merged[key]) === 'object') {\n target[key] = (0, deepClone)(merged[key], true);\n continue;\n }\n\n target[key] = merged[key];\n }\n\n return target;\n }),\n getDictItems: function getDictItems(dictCode) {\n if (!dictCode) {\n return '字典Code不能为空!';\n }\n\n if (sessionStorage.getItem('dict_data')) {\n var dict_data = JSON.parse(sessionStorage.getItem('dict_data'));\n\n if (dict_data[dictCode]) {\n var distItem = dict_data[dictCode]; // // 格式使用hotent的,key 是值 value 是显示值\n // distItem.forEach(item=>{\n // item.key = item.value\n // item.value = item.name\n // })\n\n return distItem;\n }\n }\n },\n\n /**\r\n * 深拷贝\r\n */\n deepClone: function deepClone(data) {\n var type = utils.getType(data);\n var obj;\n\n if (type === \"array\") {\n obj = [];\n } else if (type === \"object\") {\n obj = {};\n } else {\n //不再具有下一层次\n return data;\n }\n\n if (type === \"array\") {\n for (var i = 0, len = data.length; i < len; i++) {\n obj.push(utils.deepClone(data[i]));\n }\n } else if (type === \"object\") {\n for (var key in data) {\n obj[key] = utils.deepClone(data[key]);\n }\n }\n\n return obj;\n },\n getType: function getType(obj) {\n //tostring会返回对应不同的标签的构造函数\n var toString = Object.prototype.toString;\n var map = {\n \"[object Boolean]\": \"boolean\",\n \"[object Number]\": \"number\",\n \"[object String]\": \"string\",\n \"[object Function]\": \"function\",\n \"[object Array]\": \"array\",\n \"[object Date]\": \"date\",\n \"[object RegExp]\": \"regExp\",\n \"[object Undefined]\": \"undefined\",\n \"[object Null]\": \"null\",\n \"[object Object]\": \"object\"\n };\n\n if (obj instanceof Element) {\n return \"element\";\n }\n\n return map[toString.call(obj)];\n },\n isEmpty: function isEmpty(value) {\n if (value === null || value === undefined || value === \"\") {\n return true;\n } else if (value.constructor == Object) {\n return Object.keys(value).length == 0;\n } else if (value.constructor == Array) {\n return value.length == 0;\n }\n\n return false;\n },\n // 解析URL地址,如果url地址包含了${form}这样的占位符,会按照sso.js中配置的对应服务的地址替换。\n parseUrl: function parseUrl(url) {\n if (url === \"\") return;\n var ctx = window.context,\n reg = /^(\\$\\{(\\w+)\\})\\/.*$/;\n var match = reg.exec(url);\n\n if (match != null) {\n var name = match[2],\n mc = match[1],\n val = ctx[name];\n\n if (!val) {\n throw new Error(\"The '\" + name + \"' in url:\" + url + \" does not defined in context provider.\");\n }\n\n return url.replace(mc, val);\n } else {\n return url;\n }\n },\n // 使用ctx对象中的值替换掉exp中所有的${key}\n parseExp: function parseExp(exp, ctx) {\n if (!exp || exp.constructor != String) return exp;\n ctx = ctx || {};\n var reg = /(\\$\\{(\\w+)\\})/,\n match = null,\n count = 0;\n\n while (match = reg.exec(exp)) {\n count++; // 避免死循环\n\n if (count > 999) {\n break;\n }\n\n if (match != null) {\n exp = exp.replace(match[1], ctx.hasOwnProperty(match[2]) ? ctx[match[2]] : \"\");\n }\n }\n\n return exp;\n },\n // 获取随机的名称\n getName: function getName() {\n return Math.random().toString(36).substr(2, 10);\n },\n // 获取控件是否可编辑\n getWriteable: function getWriteable(permission) {\n if (permission === 'n' || permission === 'r') {\n return false;\n }\n\n return true;\n },\n // 合并验证规则(如果rules和appendRules均为字符串格式,合并后仍为字符串格式;如果其中一个为Object格式,合并后为Object格式。)\n mergeValidate: function mergeValidate(rules, appendRules) {\n if (!appendRules || appendRules.constructor !== Object && appendRules.constructor !== String) {\n return rules;\n }\n\n var rulesTypeIsString = true,\n appendTypeIsString = appendRules.constructor === String,\n finalTypeIsString = true;\n\n if (rules === undefined || rules === null) {\n rulesTypeIsString = appendTypeIsString;\n rules = appendTypeIsString ? \"\" : {};\n } else if (rules.constructor === Object || rules.constructor === String) {\n rulesTypeIsString = rules.constructor === String;\n } else {\n throw \"rules\\u7684\\u7C7B\\u578B\\u4E3A\".concat(_typeof(rules), \"\\uFF0C\\u53EA\\u80FD\\u4E3AObject\\u7C7B\\u578B\\u6216String\\u7C7B\\u578B\\u3002\");\n }\n\n finalTypeIsString = rulesTypeIsString && appendTypeIsString; // 仍然以String格式\n\n if (finalTypeIsString) {\n var ruleAry = utils.stringSplit(rules, \"|\");\n var appendAry = utils.stringSplit(appendRules, \"|\");\n var ruleObj = {},\n appendObj = {};\n ruleAry.forEach(function (r) {\n var k = utils.stringSplit(r, \":\")[0];\n ruleObj[k] = r;\n });\n appendAry.forEach(function (a) {\n var k = utils.stringSplit(a, \":\")[0];\n appendObj[k] = a;\n }); // 如果旧规则中存在与追加规则中的同名规则,则使用追加规则覆盖旧规则。\n\n var mergeObj = Object.assign(ruleObj, appendObj);\n return Object.values(mergeObj).join(\"|\");\n } // 转换为Object格式\n else {\n var _ruleObj = {},\n _appendObj = {};\n\n if (rulesTypeIsString) {\n _ruleObj = utils.validateString2Object(rules);\n } else {\n _ruleObj = _objectSpread({}, rules);\n }\n\n if (appendTypeIsString) {\n _appendObj = utils.validateString2Object(appendRules);\n } else {\n _appendObj = _objectSpread({}, appendRules);\n }\n\n return Object.assign(_ruleObj, _appendObj);\n }\n },\n // 减少校验规则\n reduceValidate: function reduceValidate(rules, reduceRules) {\n if (!rules || !reduceRules || reduceRules.constructor !== Object && reduceRules.constructor !== String) {\n return rules;\n } // 要减少的校验规则的名称集合\n\n\n var reduceRuleNames = [];\n\n if (reduceRules.constructor === String) {\n var reduceRuleObj = utils.validateString2Object(reduceRules);\n reduceRuleNames = Object.keys(reduceRuleObj);\n } else {\n reduceRuleNames = Object.keys(reduceRules);\n }\n\n if (rules.constructor === Object) {\n Object.keys(rules).forEach(function (k) {\n if (reduceRuleNames.some(function (n) {\n return n == k;\n })) {\n delete rules[k];\n }\n });\n return rules;\n } else if (rules.constructor === String) {\n var ruleAry = utils.stringSplit(rules, \"|\");\n var nRuleAry = ruleAry.reduce(function (ary, r) {\n var name = utils.stringSplit(r, \":\")[0];\n\n if (reduceRuleNames.every(function (m) {\n return m != name;\n })) {\n ary.push(r);\n }\n\n return ary;\n }, []);\n return nRuleAry.join(\"|\");\n } else {\n throw \"rules\\u7684\\u7C7B\\u578B\\u4E3A\".concat(_typeof(rules), \"\\uFF0C\\u53EA\\u80FD\\u4E3AObject\\u7C7B\\u578B\\u6216String\\u7C7B\\u578B\\u3002\");\n }\n },\n // 字符串格式的校验规则转为对象格式\n validateString2Object: function validateString2Object(rule) {\n if (!rule || rule.constructor !== String) {\n return rule;\n }\n\n var obj = {};\n var ary = utils.stringSplit(rule, '|');\n ary.forEach(function (m) {\n var regAndArgs = utils.stringSplit(m, ':');\n\n if (regAndArgs.length == 1) {\n obj[regAndArgs[0]] = true;\n } else if (regAndArgs.length > 1) {\n var args = utils.stringSplit(regAndArgs[1], \",\");\n obj[regAndArgs[0]] = args;\n }\n });\n return obj;\n },\n // 字符串str按照sep分割为数组,并清理掉数组结果中的空白项。\n stringSplit: function stringSplit(str, sep) {\n if (!str || str.constructor !== String || !sep || sep.constructor !== String) {\n return [];\n }\n\n var ary = str.split(sep);\n ary = ary.map(function (p) {\n return p.trim();\n });\n ary = ary.trim();\n return ary;\n },\n // 获取控件是否添加必填校验\n addRequiredOrNot: function addRequiredOrNot(permission, validate) {\n if (permission !== 'b') {\n return validate;\n }\n\n if (validate === undefined || validate === null) {\n validate = \"\";\n }\n\n return utils.mergeValidate(\"required\", validate);\n },\n // 格式化日期时间\n formatDate: function formatDate(value, type) {\n var date = null;\n\n if (!value) {\n return date;\n }\n\n if (value.constructor == Date && !isNaN(value.getTime())) {\n date = value;\n } else if (value.constructor == String || value.constructor == Number) {\n date = new Date(value);\n } else {\n throw \"格式化日期时,传入的数据格式不正确。\";\n }\n\n var y = date.getFullYear();\n var MM = date.getMonth() + 1;\n MM = MM < 10 ? '0' + MM : MM;\n var d = date.getDate();\n d = d < 10 ? '0' + d : d;\n var h = date.getHours();\n h = h < 10 ? '0' + h : h;\n var m = date.getMinutes();\n m = m < 10 ? '0' + m : m;\n var s = date.getSeconds();\n s = s < 10 ? '0' + s : s;\n\n if (type == 'dateTime') {\n return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;\n } else if (type == 'date') {\n return y + '-' + MM + '-' + d;\n } else if (type == 'time') {\n return h + ':' + m + ':' + s;\n }\n },\n // 格式化日期 \n formatDateYear: function formatDateYear(value) {\n var date = new Date(value);\n var y = date.getFullYear();\n var MM = date.getMonth() + 1;\n MM = MM < 10 ? '0' + MM : MM;\n var d = date.getDate();\n d = d < 10 ? '0' + d : d;\n return y + '-' + MM + '-' + d;\n },\n // 日期1是否早于日期2\n dateIsBefore: function dateIsBefore(dateOne, dateTwo, canEquals) {\n if (!dateOne || !dateTwo) {\n return true;\n }\n\n var date1 = new Date(dateOne).getTime() || new Date(new Date().format(\"yyyy-MM-dd\") + \" \" + dateOne).getTime();\n var date2 = new Date(dateTwo).getTime() || new Date(new Date().format(\"yyyy-MM-dd\") + \" \" + dateTwo).getTime();\n\n if (!canEquals) {\n //大于。v2>v1 。\n if (date2 > date1) {\n return true;\n } else {\n return false;\n }\n } else {\n //大于等于。v2>=v1 。只要v1不大于v2即可\n if (date1 > date2) {\n return false;\n } else {\n return true;\n }\n }\n },\n // 日期计算,不传单位时,默认以'天'为单位计算\n dateCalc: function dateCalc(startDate, endDate, op) {\n if (!startDate || !endDate || startDate.length == 0 || endDate.length == 0) {\n return 0;\n }\n\n if (!op || op.constructor != String) {\n op = \"day\";\n }\n\n var opAry = ['year', 'month', 'day', 'hour', 'minute', 'second'];\n\n if (opAry.indexOf(op) == -1) {\n throw \"\\u8BA1\\u7B97\\u65E5\\u671F\\u7684\\u5355\\u4F4D\\u53EA\\u80FD\\u4ECE\".concat(opAry, \"\\u4E2D\\u9009\\u62E9\");\n }\n\n var date1 = new Date(Date.parse(startDate.replace(/-/g, \"/\"))).getTime();\n var date2 = new Date(Date.parse(endDate.replace(/-/g, \"/\"))).getTime();\n\n if (!Number.isInteger(date1) || !Number.isInteger(date2)) {\n var now = new Date();\n var nowStr = now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate();\n\n if (!Number.isInteger(date1)) {\n date1 = new Date(\"\".concat(nowStr, \" \").concat(startDate)).getTime();\n }\n\n if (!Number.isInteger(date1)) {\n date2 = new Date(\"\".concat(nowStr, \" \").concat(endDate)).getTime();\n }\n\n if (!Number.isInteger(date1) || !Number.isInteger(date2)) {\n return 0;\n }\n }\n\n var res = 0;\n var days = date2 - date1;\n\n switch (op) {\n case \"year\":\n res = parseInt(days / (1000 * 60 * 60 * 24 * 30 * 12));\n break;\n\n case \"month\":\n res = parseInt(days / (1000 * 60 * 60 * 24 * 30));\n break;\n\n case \"day\":\n res = parseInt(days / (1000 * 60 * 60 * 24));\n break;\n\n case \"hour\":\n res = parseInt(days / (1000 * 60 * 60));\n break;\n\n case \"minute\":\n res = parseInt(days / (1000 * 60));\n break;\n\n case \"second\":\n res = parseInt(days / 1000);\n }\n\n return res;\n },\n nest2tile: function nest2tile(arr, childrenKey, obtainChildren) {\n var _ref;\n\n if (!childrenKey) {\n childrenKey = \"children\";\n }\n\n return (_ref = []).concat.apply(_ref, _toConsumableArray(arr.map(function (item) {\n var _ref2;\n\n var _item = _objectSpread({}, item);\n\n if (obtainChildren == undefined || obtainChildren == false) {\n delete _item[childrenKey];\n }\n\n return (_ref2 = []).concat.apply(_ref2, [_item].concat(_toConsumableArray(utils.nest2tile(item[childrenKey]))));\n })));\n },\n // 平铺结构转嵌套结构\n tile2nest: function tile2nest(array, key, pKey, childrenKey) {\n if (!array || array.constructor !== Array) {\n return array;\n } // 复制一份,避免修改原始数组\n\n\n var ary = _toConsumableArray(array);\n\n key = key || \"id\";\n pKey = pKey || \"parentId\";\n childrenKey = childrenKey || \"children\"; // 定义一个待移除数组\n\n var ary2remove = [];\n ary.map(function (item) {\n if (item[key] !== item[pKey]) {\n // 找父节点\n var p = ary.filter(function (c) {\n return c[key] === item[pKey];\n });\n\n if (p && p.length == 1) {\n p[0][childrenKey] = p[0][childrenKey] || []; // 将子节点放到父节点中\n\n p[0][childrenKey].push(item);\n ary2remove.push(item[key]);\n }\n }\n }); // 遍历移除待删除对象\n\n ary2remove.map(function (item) {\n ary = ary.filter(function (c) {\n return c[key] !== item;\n });\n });\n return ary;\n },\n // 获取控件所在表单对应的实例对象\n getOnlineFormInstance: function getOnlineFormInstance(instance) {\n if (instance == instance.$root) {\n return instance;\n }\n\n if (!instance) {\n throw \"VueComponent实例为空.\";\n }\n\n if (instance.hasOwnProperty(\"watchMap\")) {\n return instance;\n } else if (instance.$parent) {\n return utils.getOnlineFormInstance(instance.$parent);\n }\n },\n // 获取子表每一行所在的作用域元素及索引\n getSubScopeElAndIndex: function getSubScopeElAndIndex(el) {\n var subScopeEl = utils.getParentElementByAttribute(el, \"data-subname\");\n\n if (!subScopeEl) {\n return {\n subScopeEl: null,\n index: null\n };\n }\n\n var index = subScopeEl.dataset[\"index\"];\n\n if (index === undefined) {\n throw \"要计算的子表行未获取到index属性.\";\n }\n\n index = Number.parseInt(index);\n return {\n subScopeEl: subScopeEl,\n index: index\n };\n },\n // 在子表指定行中通过v-model表达式获取input对应的vue实例\n getSubInputScopeByModelExpression: function getSubInputScopeByModelExpression(subScopeEl, expression) {\n var inputAry = subScopeEl.getElementsByClassName(\"inputs\");\n var result = null;\n\n for (var i = 0, c; c = inputAry[i++];) {\n var expressionName = c.__vue__.$vnode.data.model.expression; // 兼容front端使用\n\n if (c.__vue__.$vnode && c.__vue__.$vnode.componentOptions && c.__vue__.$vnode.componentOptions.propsData && c.__vue__.$vnode.componentOptions.propsData.modelExpression) {\n expressionName = c.__vue__.$vnode.componentOptions.propsData.modelExpression;\n }\n\n if (c && c.__vue__ && c.__vue__.$vnode.data.model && expressionName === expression) {\n result = c.__vue__;\n }\n }\n\n return result;\n },\n // 获取在线表单的json格式字符串的表单数据(validate参数决定是否需要对表单进行验证)\n validateForm: function validateForm(instance, scopeName) {\n return new Promise(function (resolve, reject) {\n instance.$root.$validator.validateAll(scopeName).then(function (result) {\n if (result) {\n resolve(result);\n } else {\n reject(instance.$root.$validator.errors.items);\n }\n });\n });\n },\n // 获取指定dom元素的父级中具有指定属性的dom元素\n getParentElementByAttribute: function getParentElementByAttribute(el, attribute) {\n if (el === null || el === undefined) {\n return null;\n }\n\n if (!el.hasAttribute || typeof el.hasAttribute != 'function') {\n throw \"传入的元素el不能为空且必须为HTMLHtmlElement类型.\";\n }\n\n if (!attribute || attribute.constructor !== String) {\n throw \"传入的属性attribute不能为空且必须为String类型.\";\n }\n\n if (el.hasAttribute(attribute)) {\n return el;\n } else if (el.tagName === 'HTML') {\n return null;\n } else {\n return utils.getParentElementByAttribute(el.parentElement, attribute);\n }\n },\n // 从父级dom元素中获取指定属性的值\n getSomeAttributeFromParentElement: function getSomeAttributeFromParentElement(el, attribute) {\n var pEl = utils.getParentElementByAttribute(el, attribute);\n\n if (pEl && pEl.getAttribute && pEl.getAttribute.constructor === Function) {\n return pEl.getAttribute(attribute);\n }\n\n return null;\n },\n // 将子表属性路径转换为完整的属性路径,例如:item.name => data.sub[0].name\n getWholePathOfSub: function getWholePathOfSub(subPath, mainPath, index) {\n if (!subPath || !mainPath || index === null || !Number.isInteger(index)) {\n return null;\n }\n\n var match = subPath.split('.');\n\n if (match && match.length > 1) {\n return \"\".concat(mainPath, \"[\").concat(index, \"].\").concat(match[match.length - 1]);\n }\n\n return null;\n },\n // 通过路径取得对象中的属性\n getValueByPath: function getValueByPath(obj, path, subIndex) {\n if (!obj || !path || path.constructor != String) {\n return null;\n }\n\n if (!/^\\w?.*[\\w|\\]]$/.test(path)) {\n return null;\n }\n\n var pathAry = path.split(\".\");\n\n if (pathAry.length == 1) {\n return obj[path];\n } else if (pathAry.length > 1) {\n var ret = obj;\n\n for (var i = 0; i < pathAry.length; i++) {\n if (ret === null || ret === undefined) {\n return null;\n }\n\n var key = pathAry[i];\n var match = /^(\\w+)\\[(\\d+)\\]$/.exec(key);\n\n if (match) {\n ret = ret[match[1]][match[2]];\n } else if (ret && ret.constructor === Array) {\n var index = 0;\n\n if (subIndex != null && subIndex != undefined) {\n var preIndex = Number.parseInt(subIndex);\n\n if (!isNaN(preIndex)) {\n index = preIndex;\n }\n }\n\n ret = ret[index][key];\n } else {\n ret = ret[key];\n }\n }\n\n return ret;\n }\n\n return null;\n },\n // 通过路径设置对象中的属性\n setValueByPath: function setValueByPath(obj, path, value, subIndex) {\n if (!obj || !path || path.constructor != String) {\n return;\n }\n\n if (!/^\\w?.*[\\w|\\]]$/.test(path)) {\n return;\n }\n\n var pathAry = path.split(\".\");\n\n if (pathAry.length == 1) {\n obj[path] = value;\n } else if (pathAry.length > 1) {\n var ret = obj;\n\n for (var i = 0; i < pathAry.length; i++) {\n var key = pathAry[i];\n var match = /^(\\w+)\\[(\\d+)\\]$/.exec(key);\n\n if (i == pathAry.length - 1) {\n if (match) {\n ret[match[1]][match[2]] = value;\n } else if (ret && ret.constructor === Array) {\n var index = 0;\n\n if (subIndex != null && subIndex != undefined) {\n var preIndex = Number.parseInt(subIndex);\n\n if (!isNaN(preIndex)) {\n index = preIndex;\n }\n }\n\n ret[index][key] = value;\n } else {\n ret[key] = value;\n }\n } else {\n if (match) {\n ret = ret[match[1]][match[2]];\n } else {\n ret = ret[key];\n }\n }\n }\n }\n },\n\n /**\r\n * 将字符串转为json对象。\r\n * @param jsonStr\r\n * @param type 可不填写parseToJson\r\n * @returns\r\n */\n parseToJson: function parseToJson(jsonStr, type) {\n type = type || 1;\n if (!jsonStr || jsonStr === \"\" || type > 3) return null;\n\n try {\n switch (type) {\n case 1:\n return JSON.parse(jsonStr);\n break;\n\n case 2:\n return eval(\"(\".concat(jsonStr, \")\"));\n break;\n\n default:\n throw \"解析json对象错误\";\n break;\n }\n } catch (e) {\n return utils.parseToJson(jsonStr, type + 1);\n }\n },\n\n /**\r\n * 将数字转换成人名币大写。\r\n * \r\n * @param currencyDigits\r\n * @returns\r\n */\n convertCurrency: function convertCurrency(currencyDigits) {\n var MAXIMUM_NUMBER = 99999999999.99;\n var CN_ZERO = \"零\";\n var CN_ONE = \"壹\";\n var CN_TWO = \"贰\";\n var CN_THREE = \"叁\";\n var CN_FOUR = \"肆\";\n var CN_FIVE = \"伍\";\n var CN_SIX = \"陆\";\n var CN_SEVEN = \"柒\";\n var CN_EIGHT = \"捌\";\n var CN_NINE = \"玖\";\n var CN_TEN = \"拾\";\n var CN_HUNDRED = \"佰\";\n var CN_THOUSAND = \"仟\";\n var CN_TEN_THOUSAND = \"万\";\n var CN_HUNDRED_MILLION = \"亿\";\n var CN_SYMBOL = \"\";\n var CN_DOLLAR = \"元\";\n var CN_TEN_CENT = \"角\";\n var CN_CENT = \"分\";\n var CN_INTEGER = \"整\";\n var integral;\n var decimal;\n var outputCharacters;\n var parts;\n var digits, radices, bigRadices, decimals;\n var zeroCount;\n var i, p, d;\n var quotient, modulus;\n currencyDigits = currencyDigits.toString();\n\n if (currencyDigits == \"\") {\n return \"\";\n }\n\n if (currencyDigits.match(/[^,.\\d]/) != null) {\n return \"\";\n }\n\n if (currencyDigits.match(/^((\\d{1,3}(,\\d{3})*(.((\\d{3},)*\\d{1,3}))?)|(\\d+(.\\d+)?))$/) == null) {\n return \"\";\n }\n\n currencyDigits = currencyDigits.replace(/,/g, \"\");\n currencyDigits = currencyDigits.replace(/^0+/, \"\");\n\n if (Number(currencyDigits) > MAXIMUM_NUMBER) {\n return \"\";\n }\n\n parts = currencyDigits.split(\".\");\n\n if (parts.length > 1) {\n integral = parts[0];\n decimal = parts[1];\n decimal = decimal.substr(0, 2);\n } else {\n integral = parts[0];\n decimal = \"\";\n }\n\n digits = new Array(CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT, CN_NINE);\n radices = new Array(\"\", CN_TEN, CN_HUNDRED, CN_THOUSAND);\n bigRadices = new Array(\"\", CN_TEN_THOUSAND, CN_HUNDRED_MILLION);\n decimals = new Array(CN_TEN_CENT, CN_CENT);\n outputCharacters = \"\";\n\n if (Number(integral) > 0) {\n zeroCount = 0;\n\n for (i = 0; i < integral.length; i++) {\n p = integral.length - i - 1;\n d = integral.substr(i, 1);\n quotient = p / 4;\n modulus = p % 4;\n\n if (d == \"0\") {\n zeroCount++;\n } else {\n if (zeroCount > 0) {\n outputCharacters += digits[0];\n }\n\n zeroCount = 0;\n outputCharacters += digits[Number(d)] + radices[modulus];\n }\n\n if (modulus == 0 && zeroCount < 4) {\n outputCharacters += bigRadices[quotient];\n }\n }\n\n outputCharacters += CN_DOLLAR;\n }\n\n if (decimal != \"\") {\n for (i = 0; i < decimal.length; i++) {\n d = decimal.substr(i, 1);\n\n if (d != \"0\") {\n outputCharacters += digits[Number(d)] + decimals[i];\n }\n }\n }\n\n if (outputCharacters == \"\") {\n outputCharacters = CN_ZERO + CN_DOLLAR;\n }\n\n if (decimal == \"\") {\n outputCharacters += CN_INTEGER;\n }\n\n outputCharacters = CN_SYMBOL + outputCharacters;\n return outputCharacters;\n },\n\n /**\r\n * 通过name获取页面url地址参数\r\n * @param name\r\n * @returns\r\n * \r\n */\n getUrlKey: function getUrlKey(name) {\n return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, \"\"])[1].replace(/\\+/g, '%20')) || null;\n },\n // 返回调整顺序后的数组 part:数组中的一个或多个元素, direct:调整的方向 up:向上 down:向下\n arrayMove: function arrayMove(ary, part, direct) {\n direct = direct || \"down\";\n\n if (!part || part.constructor !== Object && part.constructor !== Array) {\n return ary;\n }\n\n if (part.constructor === Object) {\n part = [part];\n }\n\n if (direct == \"up\") {\n part.forEach(function (m) {\n var index = ary.indexOf(m, 1);\n\n if (index > 0) {\n var newAry = _toConsumableArray(ary);\n\n newAry[index - 1] = ary[index];\n newAry[index] = ary[index - 1];\n ary = newAry;\n }\n });\n } else if (direct == \"down\") {\n for (var i = part.length - 1, m; m = part[i--];) {\n var index = ary.indexOf(m, 0);\n\n if (index > -1 && index < ary.length - 1) {\n var newAry = _toConsumableArray(ary);\n\n newAry[index + 1] = ary[index];\n newAry[index] = ary[index + 1];\n ary = newAry;\n }\n }\n }\n\n return ary;\n },\n // 通过配置中指定的key所对应的属性路径在当前表单中获取对应的值,支持通过data.main.name 或者是 item.name来分别获取主表数据及子表数据的情况\n getValueByConfigKey: function getValueByConfigKey(inst, config, key) {\n if (!config.hasOwnProperty(key)) {\n throw \"config\\u5BF9\\u8C61\\u4E2D\\u672A\\u627E\\u5230\\u5C5E\\u6027\".concat(key);\n }\n\n var keyPath = config[key]; // 获取当前组件所在的表单\n\n var formInst = utils.getOnlineFormInstance(inst.$parent); // 获取当前组件是否在子表中的某一行\n\n var _utils$getSubScopeElA = utils.getSubScopeElAndIndex(inst.$el),\n subScopeEl = _utils$getSubScopeElA.subScopeEl,\n index = _utils$getSubScopeElA.index;\n\n if (subScopeEl) {\n //判断是否有孙表\n var paths = subScopeEl.dataset[\"subname\"];\n\n if (paths.split(\".\").length == 4 && paths.indexOf(\"[\") == -1) {\n //孙表回填路径\n paths = paths.split(\".\")[0] + \".\" + paths.split(\".\")[1] + \".\" + paths.split(\".\")[2] + \"[\" + parseInt(utils.getSomeAttributeFromParentElement(inst.$el, \"sub-index\")) + \"]\" + \".\" + paths.split(\".\")[3];\n } // 将item.name这样的路径替换为data.sub[0].name这样的全路径格式\n\n\n var wholeKeyPath = utils.getWholePathOfSub(keyPath, paths, index);\n return utils.getValueByPath(formInst, wholeKeyPath);\n } else {\n return utils.getValueByPath(formInst, keyPath);\n }\n },\n // 通过配置中指定的key来设置值到对应的属性路径上,支持设置主表数据data.main.name 或设置子表数据item.name\n setValueByConfigKey: function setValueByConfigKey(inst, config, key, value) {\n if (!config.hasOwnProperty(key)) {\n return;\n }\n\n var keyPath = config[key]; // 获取当前组件所在的表单\n\n var formInst = utils.getOnlineFormInstance(inst.$parent); // 获取当前组件是否在子表中的某一行\n\n var _utils$getSubScopeElA2 = utils.getSubScopeElAndIndex(inst.$el),\n subScopeEl = _utils$getSubScopeElA2.subScopeEl,\n index = _utils$getSubScopeElA2.index;\n\n if (subScopeEl) {\n //判断是否有孙表\n var paths = subScopeEl.dataset[\"subname\"];\n\n if (paths.split(\".\").length == 4 && paths.indexOf(\"[\") == -1) {\n //孙表回填路径\n paths = paths.split(\".\")[0] + \".\" + paths.split(\".\")[1] + \".\" + paths.split(\".\")[2] + \"[\" + parseInt(utils.getSomeAttributeFromParentElement(inst.$el, \"sub-index\")) + \"]\" + \".\" + paths.split(\".\")[3];\n } // 将item.name这样的路径替换为data.sub[0].name这样的全路径格式\n\n\n var wholeKeyPath = utils.getWholePathOfSub(keyPath, paths, index);\n utils.setValueByPath(formInst, wholeKeyPath, value);\n } else {\n utils.setValueByPath(formInst, keyPath, value);\n }\n },\n // 判断两个对象是否相等(props为属性数组,有传入时,只比对传入的属性是否相等)\n objectEquals: function objectEquals(obj1, obj2, props) {\n if (!props || props.constructor !== Array) {\n props = [];\n }\n\n if (!obj1 || !obj2) {\n return obj1 === obj2;\n }\n\n for (var propName in obj1) {\n if (props.length > 0 && props.indexOf(propName) === -1) {\n continue;\n }\n\n if (obj1.hasOwnProperty(propName) != obj2.hasOwnProperty(propName)) {\n return false;\n } else if (_typeof(obj1[propName]) != _typeof(obj2[propName])) {\n return false;\n }\n }\n\n for (var propName in obj2) {\n if (props.length > 0 && props.indexOf(propName) === -1) {\n continue;\n }\n\n if (obj1.hasOwnProperty(propName) != obj2.hasOwnProperty(propName)) {\n return false;\n } else if (_typeof(obj1[propName]) != _typeof(obj2[propName])) {\n return false;\n }\n\n if (!obj1.hasOwnProperty(propName)) {\n continue;\n }\n\n if (obj1[propName] instanceof Array && obj2[propName] instanceof Array) {\n if (!utils.arrayEquals(obj1[propName], obj2[propName])) {\n return false;\n }\n } else if (obj1[propName] instanceof Object && obj2[propName] instanceof Object) {\n if (!utils.objectEquals(obj1[propName], obj2[propName])) {\n return false;\n }\n } else if (obj1[propName] != obj2[propName]) {\n return false;\n }\n }\n\n return true;\n },\n // 判断两个数组是否相等,支持数组中元素为对象时的深度对比\n arrayEquals: function arrayEquals(ary1, ary2) {\n if (!ary1 || !ary2) {\n return ary1 === ary2;\n }\n\n if (ary1.length != ary2.length) {\n return false;\n }\n\n for (var i = 0, l = ary1.length; i < l; i++) {\n if (ary1[i] instanceof Array && ary2[i] instanceof Array) {\n if (!utils.arrayEquals(ary1[i], ary2[i])) {\n return false;\n }\n } else if (ary1[i] instanceof Object && ary2[i] instanceof Object) {\n if (!utils.objectEquals(ary1[i], ary2[i])) {\n return false;\n }\n } else if (ary1[i] != ary2[i]) {\n return false;\n }\n }\n\n return true;\n },\n // 以第一行文本的缩进空格数为基准,后续的每一行都去掉这个基准所对应的空格。\n trimEachLine: function trimEachLine(text) {\n if (!text || text.constructor != String || text.indexOf(\"\\n\") == -1) {\n return text;\n }\n\n var ary = text.split(\"\\n\"),\n totem = 0;\n return ary.reduce(function (prev, cur, index) {\n if (index == 1) {\n var match = /^(\\s+).*$/.exec(cur);\n match && match.length == 2 && (totem = match[1].length);\n }\n\n return prev + \"\\n\" + cur.slice(totem, cur.length);\n });\n },\n // 获取字符串的哈希编码\n hashCode: function hashCode(text) {\n var hash = 0,\n char;\n if (text.length == 0) return hash;\n\n for (var i = 0; i < text.length; i++) {\n char = text.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n return hash;\n }\n}; // 在数组上扩展一个删除指定项的方法\n\nArray.prototype.remove = function (item) {\n var index = this.findIndex(function (v) {\n return v === item;\n });\n\n if (index > -1) {\n this.splice(index, 1);\n }\n}; // 清空数组\n\n\nArray.prototype.empty = function () {\n this.splice(0, this.length);\n}; // 在数组上扩展一个去重的方法\n\n\nArray.prototype.unique = function (arg) {\n var res = new Map();\n return this.filter(function (m) {\n if (arg) {\n return !res.has(m[arg]) && res.set(m[arg], 1);\n } else {\n return !res.has(m) && res.set(m, 1);\n }\n });\n}; // 去除数组中的空字符串选项\n\n\nArray.prototype.trim = function () {\n return this.filter(function (m) {\n return m !== '';\n });\n}; // 按照数组中的指定key将数组进行分组\n\n\nArray.prototype.groupByKey = function (key) {\n var res = {};\n this.forEach(function (m) {\n var group = res[m[key]];\n\n if (!group) {\n group = [];\n res[m[key]] = group;\n }\n\n group.push(m);\n });\n return res;\n}; // 按照数组中的指定key将数组进行分组\n\n\nArray.prototype.groupByKey = function (key) {\n var res = {};\n this.forEach(function (m) {\n var group = res[m[key]];\n\n if (!group) {\n group = [];\n res[m[key]] = group;\n }\n\n group.push(m);\n });\n return res;\n}; // 将数组对象中的某一个属性值单独抽取出来成为一个新的数组 [{id:'1',name:'苹果'},{id:'2',name:'香蕉'}].extractByKey(\"id\") ==> ['1','2']\n\n\nArray.prototype.extractByKey = function (key) {\n var set = new Set();\n this.forEach(function (m) {\n if (key && m[key]) {\n set.add(m[key]);\n }\n });\n return Array.from(set);\n};\n/**\r\n * 日期格式化。\r\n * 日期格式:\r\n * yyyy,yy 年份\r\n * MM 大写表示月份\r\n * dd 表示日期\r\n * hh 表示小时\r\n * mm 表示分钟\r\n * ss 表示秒\r\n * q 表示季度\r\n * 实例如下:\r\n * var now = new Date(); \r\n * var nowStr = now.format(\"yyyy-MM-dd hh:mm:ss\"); \r\n */\n\n\nDate.prototype.format = function (format) {\n var o = {\n \"M+\": this.getMonth() + 1,\n //month \n \"d+\": this.getDate(),\n //day \n \"h+\": this.getHours(),\n //hour \n \"H+\": this.getHours(),\n //hour\n \"m+\": this.getMinutes(),\n //minute \n \"s+\": this.getSeconds(),\n //second \n \"q+\": Math.floor((this.getMonth() + 3) / 3),\n //quarter \n \"S\": this.getMilliseconds() //millisecond \n\n };\n\n if (/(y+)/.test(format)) {\n format = format.replace(RegExp.$1, (this.getFullYear() + \"\").substr(4 - RegExp.$1.length));\n }\n\n for (var k in o) {\n if (new RegExp(\"(\" + k + \")\").test(format)) {\n format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : (\"00\" + o[k]).substr((\"\" + o[k]).length));\n }\n }\n\n return format;\n};\n\nexport default utils;",null]}