推荐最后一种自定义函数方法

在一些特殊情况下,对象是动态的,它可用是一级、二级、多级对象,这是不规整的
那么如何获取这种动态属性的对象属性值呢?

例如有如下对象

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
const obj = {
lisi: {
age: 18,
"test-age": 20,
hobby: [
"写代码",
"打篮球",
{
Games: ["英雄联盟", "古墓丽影", "神秘海域"],
},
],
},
};

const key1 = "lisi";
const key2 = "age";
const key3 = "lisi.age";

// 以下输出全为 undefined ; 因为 obj 内压根就没有key1~key3这个3属性
console.log(obj.key1);
console.log(obj.key2);
console.log(obj.key3);

// 1. 静态获取(一般正常方式) 不过这种方式有一定缺陷,例如无法获取 test-age
console.log(obj.lisi.age); // 18
// console.log(obj.lisi.test-age); // 语法报错

// 2. 动态获取; 可解决上方无法获取 test-age的问题
console.log(obj.lisi["test-age"]); // 20

console.log(obj[key1].age); // 18

console.log(obj[key1][key2]); // 18

// 为什么会是undefined? 因为obj内没有 lisi.age (lisi.age被视为一个key,即test-age相同)
console.log(obj[key3]); // undefined

// 使用eval函数动态获取(既然是动态获取test-age也是没问题的)
console.log(eval(`obj.${key1}.age`)); // 18
console.log(eval(`obj.${key1}.${key2}`)); // 18
console.log(eval("obj." + key3)); // 18

// 使用 Function 动态获取 (此方法在浏览器控制台可用,但是放到nodejs里就不行了,目前我还不知道是什么情况)
// console.log(new Function("return " + ("obj." + key1))());

// 自定义函数(推荐)
function GetProperty(obj, str) {
str = str.replace(/\[(\w+)\]/g, ".$1"); // 处理数组下标
let arr = str.split(".");
for (let i in arr) {
obj = obj[arr[i]] || "";
}
return obj;
}
console.log(GetProperty(obj, key3)); // 18
console.log(GetProperty(obj, "lisi.test-age")); // 20
console.log(GetProperty(obj, "lisi.hobby[2].Games[1]")); // 古墓丽影