UNPKG

gtht-miniapp-sdk

Version:

gtht-miniapp-sdk 是一套基于 Uniapp + Vue3 框架开发的兼容多端的 UI 组件库

153 lines (152 loc) 4.46 kB
import { isPlainObject } from './is'; /** * 此方法创建一个对象,该对象由自己不可省略的属性组成。 */ export function omit(object, paths) { const newObj = {}; Object.keys(object).forEach((key) => { if (!paths.includes(key)) { ; newObj[key] = object[key]; } }); return newObj; } /** * 深度克隆对象,仅克隆数组和无格式对象,其他类型会被直接返回 */ export function deepClone(target) { if (Array.isArray(target)) { return target.map((item) => { return deepClone(item); }); } if (isPlainObject(target)) { const obj = {}; Object.keys(target).forEach((k) => { obj[k] = deepClone(target[k]); }); return obj; } return target; } /** * 深拷贝其他对象到第一个对象 */ export function extend(...args) { const target = args[0], l = args.length; let i = 1, options, name, src, copy, copyIsArray, clone; for (; i < l; i++) { options = args[i]; if (options !== null && options !== undefined) { for (name in options) { src = target[name]; copy = options[name]; // 防止有环 if (target === copy) { continue; } // 深复制 if (copy && (isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) { if (copyIsArray) { copyIsArray = false; clone = src && Array.isArray(src) ? src : []; } else { clone = isPlainObject(src) ? src : {}; } // 只克隆对象,不移动 target[name] = extend(clone, copy); // 不添加未定义的值 } else if (copy !== undefined) { target[name] = copy; } } } } return target; } export function treeToMap(tree, keyName, childrenName, parentName) { const map = {}; function recurse(children, parent) { children.forEach((node) => { map[node[keyName]] = node; node[parentName] = parent; if (Array.isArray(node[childrenName])) { recurse(node[childrenName], node); } }); } recurse(tree, null); return map; } /** * @description: 链式获取对象值 * @param object * @param chain 通过点分割的字符串或者字符串数组 */ export function chainGet(object, chain) { let target = object; if (chain) { chain = typeof chain === 'string' ? chain.split('.') : chain; for (const key of chain) { if (target && typeof target === 'object') { target = target[key]; } else { return target; } } } return target; } /** * @description: 链式设置对象值 * @param object * @param chain 通过点分割的字符串或者字符串数组 * @param value 要设置的值 */ export function chainSet(object, chain, value) { let target = object; chain = typeof chain === 'string' ? chain.split('.') : chain; if (chain.length === 0) { return; } for (let i = 0, l = chain.length; i < l; i++) { if (target && typeof target === 'object') { const key = chain[i]; if (i === l - 1) { target[key] = value; return; } else { target = target[key]; } } else { return; } } } // 将嵌套数据结构转换为多维数组 export function nestedToMulti(nested, values, fieldKeys) { const columns = []; function recurse(list, index = 0) { columns.push(list); const selectedValue = values[index]; let selectedOption = list.find((option) => option[fieldKeys.value] === selectedValue); if (!selectedOption) { selectedOption = list[0]; } if (selectedOption) { const nextList = selectedOption[fieldKeys.children]; if (Array.isArray(nextList)) { recurse(nextList, ++index); } } } recurse(nested); return columns; }