1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
export default {
set(object, path, value) {
if (typeof object !== "object") return object;
this.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;
},
basePath(path) {
// 若是数组,则直接返回
if (Array.isArray(path)) return path;
// 若有 '[',']',则替换成将 '[' 替换成 '.',去掉 ']'
return path.replace(/\[/g, ".").replace(/\]/g, "").split(".");
},
get(object, path, defaultValue) {
// 判断 object 是否是数组或者对象,否则直接返回默认值 defaultValue
if (typeof object !== "object") return defaultValue;
// 沿着路径寻找到对应的值,未找到则返回默认值 defaultValue
return (
this.basePath(path).reduce((o, k) => (o || {})[k], object) || defaultValue
);
}
}