js中怎么动态拼接对象的属性并获取它的值?

如以下例子:
给定一个这种结构的对象obj,想通过循环取出它里面属性的值,平时我们都直接用obj.a或者obj["a"]这2种形式去取。但是我现在想给定一个字符串,比如"a.a3.a3_1"这种,然后想通过循环遍历去获取对应的值,js中该怎么写?不清楚怎么更好的把这个字符串拼接成属性去取,我想写一个通用的方法的。

const obj = {
        a: {
            a1: 1,
            a2: 2,
            a3: {
                a3_1: "a3_1"
            }
        },
        b: {
            b1: {
                b1_1: "b1_1"
            },
            b2: {
                b2_1: "b2_1"
            },
            b3: 3
        }
    }

这是我自己笨方法实现的,不知道会不会出问题,哈哈

const propertyStr= "a.a3.a3_1";
const properties = propertyStr.split(".");
let result = obj;
properties.map(cur => {
   result = result[cur];
});
console.log(result); // a3_1
阅读 7.5k
2 个回答

可以自己写,也可以考虑使用现成的库,比如loadsh直接支持这种写法。

const value = _.get(obj, 'a.a3.a3_1');
console.log(value) // a3_1

异常处理,第三个参数给定如果异常情况下的默认值

const value = _.get(obj, 'a.a3.a3_1', 0);
// 如果a3_1不存在
console.log(value) // 0

不过要注意的两点:

1.使用lodash这种方法会自动容错,也就是如果obj下的a根本就不存在,最终也会返回一个undefined,不会抛出错误。
2.第三个参数给定默认值的情况针对null无效,也就是说如果a3_1的值是null,那么不会设定默认值,只有undefined才会设定默认值0。

Ps:如果自己写可以参考loadash的源码,将更多因素考虑进去
https://zhuanlan.zhihu.com/p/...

你这个写法可以,好像也没有更优雅的写法。只是如果propertyStr不正确,会发生访问undefined属性的异常。

推荐问题