interface SetByPathOptions { delimiter?: string; onlyUpdateUndefined?: boolean; infer?: (path: string[]) => any; } /** * * 更新对象指定路径的值 * * 1. 如果路径不存在,自动创建,创建的类型是根据infer函数来推断 * const obj = {} * 默认infer=()=>({}),自动推断为一个对象 * setByPath(obj,"a.b",1) // { a: { b: 1 }} * * setByPath(obj,"a.0",1,{ * infer: (path) => path.startsWith('a') ? [] : {} * }) // { a: [1]}} * * * 2. 路径分隔符默认为 '.',允许通过delimiter自定义 * 3. 支持Map、Set、Array * 4. 更新数组时 * * 数组索引只以>=0与<=数组长度。 * * const obj = { * a: * { b: * { c: * 1 } * }, * x:[1,2,3] * } * * setByPath(obj,"x.1",0) // { a: { b: { c: 1 } }, x: [1, 0, 3] } * setByPath(obj,"x.2",0) // { a: { b: { c: 1 } }, x: [1, 0, 0] } * setByPath(obj,"x.3",0) // { a: { b: { c: 1 } }, x: [1, 0, 0,0] } * setByPath(obj,"x.13",0) // 无效,因为无法扩展数组 * * 4. 其他的视为普通对象,自动创建 * * setByPath(obj,"m.n.o",100) // { a: { b: { c: 1 } }, x: [1, 0, 0,0],m: { n: { o: 100 } } } * * * * @param obj * @param path * @param value * @param options */ /** * 更新对象指定路径的值 * * 1. 如果路径不存在,自动创建,创建的类型是根据infer函数来推断 * * setByPath(obj,"m.n.o",100) // { a: { b: { c: 1 } }, x: [1, 0, 0, 0], m: { n: { o: 100 } } } * * 2. 路径分隔符默认为 '.',允许通过delimiter自定义 * 3. 支持Map、Set、Array * 4. 更新数组时 * * 数组索引只以>=0与<=数组长度。 * * const obj = { * a: * { b: * { c: 1 } * }, * x:[1,2,3] * } * * setByPath(obj,"x.1",0) // { a: { b: { c: 1 } }, x: [1, 0, 3] } * setByPath(obj,"x.2",0) // { a: { b: { c: 1 } }, x: [1, 0, 0] } * setByPath(obj,"x.3",0) // { a: { b: { c: 1 } }, x: [1, 0, 0, 0] } * setByPath(obj,"x.13",0) // 无效,因为无法扩展数组 * * * @param obj * @param path * @param value * @param options */ declare function setByPath
(obj: T, path: P, value: any, options?: SetByPathOptions): T; export { type SetByPathOptions, setByPath };