123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- /**
- * 对象类
- */
- export class ObjectManager {
- constructor() {}
- /**
- * 对象转url参数
- * @param {*} data,对象
- * @param {*} isPrefix,是否自动加上"?"
- * 参考:uview
- **/
- queryParams = (data = {}, isPrefix = true, arrayFormat = 'brackets') => {
- let prefix = isPrefix ? '?' : ''
- let _result = []
- if (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets';
- for (let key in data) {
- let value = data[key]
- // 去掉为空的参数
- if (['', undefined, null].indexOf(value) >= 0) {
- continue;
- }
- // 如果值为数组,另行处理
- if (value.constructor === Array) {
- // e.g. {ids: [1, 2, 3]}
- switch (arrayFormat) {
- case 'indices':
- // 结果: ids[0]=1&ids[1]=2&ids[2]=3
- for (let i = 0; i < value.length; i++) {
- _result.push(key + '[' + i + ']=' + value[i])
- }
- break;
- case 'brackets':
- // 结果: ids[]=1&ids[]=2&ids[]=3
- value.forEach(_value => {
- _result.push(key + '[]=' + _value)
- })
- break;
- case 'repeat':
- // 结果: ids=1&ids=2&ids=3
- value.forEach(_value => {
- _result.push(key + '=' + _value)
- })
- break;
- case 'comma':
- // 结果: ids=1,2,3
- let commaStr = "";
- value.forEach(_value => {
- commaStr += (commaStr ? "," : "") + _value;
- })
- _result.push(key + '=' + commaStr)
- break;
- default:
- value.forEach(_value => {
- _result.push(key + '[]=' + _value)
- })
- }
- } else {
- _result.push(key + '=' + value)
- }
- }
- return _result.length ? prefix + _result.join('&') : ''
- }
- /**
- * @description 克隆对象
- * @param {object} obj 需要深度克隆的对象
- * @returns {*} 克隆后的对象或者原值(不是对象)
- */
- clone = (obj, cache = new WeakMap()) => {
- if (obj === null || typeof obj !== 'object') return obj;
- if (cache.has(obj)) return cache.get(obj);
- let clone;
- if (obj instanceof Date) {
- clone = new Date(obj.getTime());
- } else if (obj instanceof RegExp) {
- clone = new RegExp(obj);
- } else if (obj instanceof Map) {
- clone = new Map(Array.from(obj, ([key, value]) => [key, this.clone(value, cache)]));
- } else if (obj instanceof Set) {
- clone = new Set(Array.from(obj, value => this.clone(value, cache)));
- } else if (Array.isArray(obj)) {
- clone = obj.map(value => this.clone(value, cache));
- } else if (Object.prototype.toString.call(obj) === '[object Object]') {
- clone = Object.create(Object.getPrototypeOf(obj));
- cache.set(obj, clone);
- for (const [key, value] of Object.entries(obj)) {
- clone[key] = this.clone(value, cache);
- }
- } else {
- clone = Object.assign({}, obj);
- }
- cache.set(obj, clone);
- return clone;
- }
- /**
- * @description JS对象深度合并
- * @param {object} target 需要拷贝的对象
- * @param {object} source 拷贝的来源对象
- * @returns {object|boolean} 深度合并后的对象或者false(入参有不是对象)
- */
- merge = (target = {}, source = {}) => {
- target = this.clone(target)
- if (typeof target !== 'object' || target === null || typeof source !== 'object' || source === null) return target;
- const merged = Array.isArray(target) ? target.slice() : Object.assign({}, target);
- for (const prop in source) {
- if (!source.hasOwnProperty(prop)) continue;
- const sourceValue = source[prop];
- const targetValue = merged[prop];
- if (sourceValue instanceof Date) {
- merged[prop] = new Date(sourceValue);
- } else if (sourceValue instanceof RegExp) {
- merged[prop] = new RegExp(sourceValue);
- } else if (sourceValue instanceof Map) {
- merged[prop] = new Map(sourceValue);
- } else if (sourceValue instanceof Set) {
- merged[prop] = new Set(sourceValue);
- } else if (typeof sourceValue === 'object' && sourceValue !== null) {
- merged[prop] = deepMerge(targetValue, sourceValue);
- } else {
- merged[prop] = sourceValue;
- }
- }
- return merged;
- }
- /**
- * @description 获取某个对象下的属性,用于通过类似'a.b.c'的形式去获取一个对象的的属性的形式
- * @param {object} obj 对象
- * @param {string} key 需要获取的属性字段
- * @returns {*}
- */
- getProperty = (obj, key) => {
- if (!obj) {
- return
- }
- if (typeof key !== 'string' || key === '') {
- return ''
- }
- if (key.indexOf('.') !== -1) {
- const keys = key.split('.')
- let firstObj = obj[keys[0]] || {}
- for (let i = 1; i < keys.length; i++) {
- if (firstObj) {
- firstObj = firstObj[keys[i]]
- }
- }
- return firstObj
- }
- return obj[key]
- }
- /**
- * @description 设置对象的属性值,如果'a.b.c'的形式进行设置
- * @param {object} obj 对象
- * @param {string} key 需要设置的属性
- * @param {string} value 设置的值
- */
- setProperty = (obj, key, value) => {
- if (!obj) {
- return
- }
- // 递归赋值
- const inFn = function(_obj, keys, v) {
- // 最后一个属性key
- if (keys.length === 1) {
- _obj[keys[0]] = v
- return
- }
- // 0~length-1个key
- while (keys.length > 1) {
- const k = keys[0]
- if (!_obj[k] || (typeof _obj[k] !== 'object')) {
- _obj[k] = {}
- }
- const key = keys.shift()
- // 自调用判断是否存在属性,不存在则自动创建对象
- inFn(_obj[k], keys, v)
- }
- }
- if (typeof key !== 'string' || key === '') {
- } else if (key.indexOf('.') !== -1) { // 支持多层级赋值操作
- const keys = key.split('.')
- inFn(obj, keys, value)
- } else {
- obj[key] = value
- }
- }
- /**
- * 是否是对象
- * @param {Object} value
- */
- isObject(value) {
- return Object.prototype.toString.call(value) === '[object Object]'
- }
- /**
- * 移除空值
- */
- trim = (obj) => {
- let map = {};
- for (const key in obj) {
- if (Object.hasOwnProperty.call(obj, key)) {
- // 如果是字符串要 trim
- const value = (typeof obj[key] === 'string') ? obj[key].trim() : obj[key];
- if (!!value || value === 0) {
- map[key] = value;
- }
- }
- }
- return map;
- }
- /**
- * 将对象按照键名排序
- * @param obj 要处理的对象
- * @param type 排序方式,asc:升序,desc:降序
- * v1.0.1
- */
- sort = (obj, type = "asc") => {
- // 获取键名
- let newParams = {};
- let keys = Object.keys(obj).sort();
- if (type == "desc") {
- keys.reverse();
- }
- for (let i = 0; i < keys.length; i++) {
- let value = obj[keys[i]];
- newParams[keys[i]] = value;
- }
- return newParams;
- }
- }
|