import { isObject } from "./isObject" import { normalizeKeyPath } from "./normalizeKeyPath" /** * 根据键名路径给对象赋值,成功返回 true * 当设置 overwrite = true 时当路径不存在或路径中存在不可赋值项时自动创建对象 * * @param object 对象 * @param path 键名路径 * @param value 值 * @param overwrite 覆盖,当路径不存在或路径中存在不可赋值项时自动创建对象 * * @example * let obj = {a:{b:1}} * setObjectValue(a,"a.b",3) // obj => {a:{b:3}} * setObjectValue(a,"a.b.d.e",5, true) // obj => {a:{b:{c:{d:5}}}} * @return {any} */ export function setObjectValue(object: object, path: string | string[], value: any, overwrite = false) { let keyPath = normalizeKeyPath(path) let cursor: any = object // keyPath 为空数组直接返回 false if (keyPath.length <= 0) return false for (let i = 0, len = keyPath.length; i < len; i++) { let key = keyPath[i] // 最后一个key if (i == len - 1) { cursor[key] = value return true } else { // 路径不存在的情况 if (!isObject(cursor[key])) { if (overwrite) { cursor[key] = {} } else { return false } } cursor = cursor[key] } } return false }