¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * ç®åå¤ç对象æ·è´ |
| | | * @param {Obejct} 被æ·è´å¯¹è±¡ |
| | | * @@return {Object} æ·è´å¯¹è±¡ |
| | | */ |
| | | export const deepCopy = (val) => { |
| | | return JSON.parse(JSON.stringify(val)) |
| | | } |
| | | /** |
| | | * è¿æ»¤æ°åç±»å |
| | | * @param {String} format æ°åç±»å |
| | | * @@return {Boolean} è¿åæ¯å¦ä¸ºæ°åç±»å |
| | | */ |
| | | export const typeFilter = (format) => { |
| | | return format === 'int' || format === 'double' || format === 'number' || format === 'timestamp'; |
| | | } |
| | | |
| | | /** |
| | | * æ value è½¬æ¢ææå®çç±»åï¼ç¨äºå¤çåå§å¼ï¼åå æ¯åå§å¼éè¦å
¥åºä¸è½ä¸º undefined |
| | | * @param {String} key åæ®µå |
| | | * @param {any} value åæ®µå¼ |
| | | * @param {Object} rules è¡¨åæ ¡éªè§å |
| | | */ |
| | | export const getValue = (key, value, rules) => { |
| | | const isRuleNumType = rules.find(val => val.format && typeFilter(val.format)); |
| | | const isRuleBoolType = rules.find(val => (val.format && val.format === 'boolean') || val.format === 'bool'); |
| | | // è¾å
¥ç±»å为 number |
| | | if (!!isRuleNumType) { |
| | | if (!value && value !== 0) { |
| | | value = null |
| | | } else { |
| | | value = isNumber(Number(value)) ? Number(value) : value |
| | | } |
| | | } |
| | | |
| | | // è¾å
¥ç±»å为 boolean |
| | | if (!!isRuleBoolType) { |
| | | value = isBoolean(value) ? value : false |
| | | } |
| | | |
| | | return value; |
| | | } |
| | | |
| | | /** |
| | | * è·åè¡¨åæ°æ® |
| | | * @param {String|Array} name çå®åç§°ï¼éè¦ä½¿ç¨ realName è·å |
| | | * @param {Object} data åå§æ°æ® |
| | | * @param {any} value éè¦è®¾ç½®çå¼ |
| | | */ |
| | | export const setDataValue = (field, formdata, value) => { |
| | | formdata[field] = value |
| | | return value || '' |
| | | } |
| | | |
| | | /** |
| | | * è·åè¡¨åæ°æ® |
| | | * @param {String|Array} field çå®åç§°ï¼éè¦ä½¿ç¨ realName è·å |
| | | * @param {Object} data åå§æ°æ® |
| | | */ |
| | | export const getDataValue = (field, data) => { |
| | | return objGet(data, field) |
| | | } |
| | | |
| | | /** |
| | | * è·å表åç±»å |
| | | * @param {String|Array} field çå®åç§°ï¼éè¦ä½¿ç¨ realName è·å |
| | | */ |
| | | export const getDataValueType = (field, data) => { |
| | | const value = getDataValue(field, data) |
| | | return { |
| | | type: type(value), |
| | | value |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·å表åå¯ç¨ççå®name |
| | | * @param {String|Array} name 表åname |
| | | * @@return {String} 表åå¯ç¨ççå®name |
| | | */ |
| | | export const realName = (name, data = {}) => { |
| | | const base_name = _basePath(name) |
| | | if (typeof base_name === 'object' && Array.isArray(base_name) && base_name.length > 1) { |
| | | const realname = base_name.reduce((a, b) => a += `#${b}`, '_formdata_') |
| | | return realname |
| | | } |
| | | return base_name[0] || name |
| | | } |
| | | |
| | | /** |
| | | * 夿æ¯å¦è¡¨åå¯ç¨ççå®name |
| | | * @param {String|Array} name 表åname |
| | | * @@return {String} 表åå¯ç¨ççå®name |
| | | */ |
| | | export const isRealName = (name) => { |
| | | const reg = /^_formdata_#*/ |
| | | return reg.test(name) |
| | | } |
| | | |
| | | /** |
| | | * è·åè¡¨åæ°æ®çåå§æ ¼å¼ |
| | | * @@return {Object|Array} object éè¦è§£æçæ°æ® |
| | | */ |
| | | export const rawData = (object = {}, name) => { |
| | | let newData = JSON.parse(JSON.stringify(object)) |
| | | let formData = {} |
| | | for(let i in newData){ |
| | | let path = name2arr(i) |
| | | objSet(formData,path,newData[i]) |
| | | } |
| | | return formData |
| | | } |
| | | |
| | | /** |
| | | * çå®nameè¿å为 array |
| | | * @param {*} name |
| | | */ |
| | | export const name2arr = (name) => { |
| | | let field = name.replace('_formdata_#', '') |
| | | field = field.split('#').map(v => (isNumber(v) ? Number(v) : v)) |
| | | return field |
| | | } |
| | | |
| | | /** |
| | | * 对象ä¸è®¾ç½®å¼ |
| | | * @param {Object|Array} object æºæ°æ® |
| | | * @param {String| Array} path 'a.b.c' æ ['a',0,'b','c'] |
| | | * @param {String} value éè¦è®¾ç½®çå¼ |
| | | */ |
| | | export const objSet = (object, path, value) => { |
| | | if (typeof object !== 'object') return object; |
| | | _basePath(path).reduce((o, k, i, _) => { |
| | | if (i === _.length - 1) { |
| | | // è¥éåç»æç´æ¥èµå¼ |
| | | o[k] = value |
| | | return null |
| | | } else if (k in o) { |
| | | // è¥åå¨å¯¹åºè·¯å¾ï¼åè¿åæ¾å°ç对象ï¼è¿è¡ä¸ä¸æ¬¡éå |
| | | return o[k] |
| | | } else { |
| | | // è¥ä¸åå¨å¯¹åºè·¯å¾ï¼åå建对åºå¯¹è±¡ï¼è¥ä¸ä¸è·¯å¾æ¯æ°åï¼æ°å¯¹è±¡èµå¼ä¸ºç©ºæ°ç»ï¼å¦åèµå¼ä¸ºç©ºå¯¹è±¡ |
| | | o[k] = /^[0-9]{1,}$/.test(_[i + 1]) ? [] : {} |
| | | return o[k] |
| | | } |
| | | }, object) |
| | | // è¿åobject |
| | | return object; |
| | | } |
| | | |
| | | // å¤ç pathï¼ pathæä¸ç§å½¢å¼ï¼'a[0].b.c'ã'a.0.b.c' å ['a','0','b','c']ï¼éè¦ç»ä¸å¤çææ°ç»ï¼ä¾¿äºåç»ä½¿ç¨ |
| | | function _basePath(path) { |
| | | // è¥æ¯æ°ç»ï¼åç´æ¥è¿å |
| | | if (Array.isArray(path)) return path |
| | | // è¥æ '[',']'ï¼åæ¿æ¢æå° '[' æ¿æ¢æ '.',廿 ']' |
| | | return path.replace(/\[/g, '.').replace(/\]/g, '').split('.') |
| | | } |
| | | |
| | | /** |
| | | * ä»å¯¹è±¡ä¸è·åå¼ |
| | | * @param {Object|Array} object æºæ°æ® |
| | | * @param {String| Array} path 'a.b.c' æ ['a',0,'b','c'] |
| | | * @param {String} defaultVal å¦ææ æ³ä»è°ç¨é¾ä¸è·åå¼çé»è®¤å¼ |
| | | */ |
| | | export const objGet = (object, path, defaultVal = 'undefined') => { |
| | | // å
å°pathå¤çæç»ä¸æ ¼å¼ |
| | | let newPath = _basePath(path) |
| | | // éå½å¤çï¼è¿åæåç»æ |
| | | let val = newPath.reduce((o, k) => { |
| | | return (o || {})[k] |
| | | }, object); |
| | | return !val || val !== undefined ? val : defaultVal |
| | | } |
| | | |
| | | |
| | | /** |
| | | * æ¯å¦ä¸º number ç±»å |
| | | * @param {any} num éè¦å¤æçå¼ |
| | | * @return {Boolean} æ¯å¦ä¸º number |
| | | */ |
| | | export const isNumber = (num) => { |
| | | return !isNaN(Number(num)) |
| | | } |
| | | |
| | | /** |
| | | * æ¯å¦ä¸º boolean ç±»å |
| | | * @param {any} bool éè¦å¤æçå¼ |
| | | * @return {Boolean} æ¯å¦ä¸º boolean |
| | | */ |
| | | export const isBoolean = (bool) => { |
| | | return (typeof bool === 'boolean') |
| | | } |
| | | /** |
| | | * æ¯å¦æå¿
å¡«åæ®µ |
| | | * @param {Object} rules è§å |
| | | * @return {Boolean} æ¯å¦æå¿
å¡«åæ®µ |
| | | */ |
| | | export const isRequiredField = (rules) => { |
| | | let isNoField = false; |
| | | for (let i = 0; i < rules.length; i++) { |
| | | const ruleData = rules[i]; |
| | | if (ruleData.required) { |
| | | isNoField = true; |
| | | break; |
| | | } |
| | | } |
| | | return isNoField; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è·åæ°æ®ç±»å |
| | | * @param {Any} obj éè¦è·åæ°æ®ç±»åçå¼ |
| | | */ |
| | | export const type = (obj) => { |
| | | var class2type = {}; |
| | | |
| | | // çæclass2typeæ å° |
| | | "Boolean Number String Function Array Date RegExp Object Error".split(" ").map(function(item, index) { |
| | | class2type["[object " + item + "]"] = item.toLowerCase(); |
| | | }) |
| | | if (obj == null) { |
| | | return obj + ""; |
| | | } |
| | | return typeof obj === "object" || typeof obj === "function" ? |
| | | class2type[Object.prototype.toString.call(obj)] || "object" : |
| | | typeof obj; |
| | | } |
| | | |
| | | /** |
| | | * å¤æä¸¤ä¸ªå¼æ¯å¦ç¸ç |
| | | * @param {any} a å¼ |
| | | * @param {any} b å¼ |
| | | * @return {Boolean} æ¯å¦ç¸ç |
| | | */ |
| | | export const isEqual = (a, b) => { |
| | | //妿aåbæ¬æ¥å°±å
¨ç |
| | | if (a === b) { |
| | | //夿æ¯å¦ä¸º0å-0 |
| | | return a !== 0 || 1 / a === 1 / b; |
| | | } |
| | | //夿æ¯å¦ä¸ºnullåundefined |
| | | if (a == null || b == null) { |
| | | return a === b; |
| | | } |
| | | //æ¥ä¸æ¥å¤æaåbçæ°æ®ç±»å |
| | | var classNameA = toString.call(a), |
| | | classNameB = toString.call(b); |
| | | //å¦ææ°æ®ç±»åä¸ç¸çï¼åè¿åfalse |
| | | if (classNameA !== classNameB) { |
| | | return false; |
| | | } |
| | | //å¦ææ°æ®ç±»åç¸çï¼åæ ¹æ®ä¸åæ°æ®ç±»ååå«å¤æ |
| | | switch (classNameA) { |
| | | case '[object RegExp]': |
| | | case '[object String]': |
| | | //è¿è¡åç¬¦ä¸²è½¬æ¢æ¯è¾ |
| | | return '' + a === '' + b; |
| | | case '[object Number]': |
| | | //è¿è¡æ°åè½¬æ¢æ¯è¾,夿æ¯å¦ä¸ºNaN |
| | | if (+a !== +a) { |
| | | return +b !== +b; |
| | | } |
| | | //夿æ¯å¦ä¸º0æ-0 |
| | | return +a === 0 ? 1 / +a === 1 / b : +a === +b; |
| | | case '[object Date]': |
| | | case '[object Boolean]': |
| | | return +a === +b; |
| | | } |
| | | //妿æ¯å¯¹è±¡ç±»å |
| | | if (classNameA == '[object Object]') { |
| | | //è·åaåbç屿§é¿åº¦ |
| | | var propsA = Object.getOwnPropertyNames(a), |
| | | propsB = Object.getOwnPropertyNames(b); |
| | | if (propsA.length != propsB.length) { |
| | | return false; |
| | | } |
| | | for (var i = 0; i < propsA.length; i++) { |
| | | var propName = propsA[i]; |
| | | //妿坹åºå±æ§å¯¹åºå¼ä¸ç¸çï¼åè¿åfalse |
| | | if (a[propName] !== b[propName]) { |
| | | return false; |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | //å¦ææ¯æ°ç»ç±»å |
| | | if (classNameA == '[object Array]') { |
| | | if (a.toString() == b.toString()) { |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | } |