js 深层对象取值

js如何优雅地根据变量取得深层嵌套对象的值?
例如
var obj = {
a: {
a1: '...',
a2: '...',
a3: {
a31: '...',
a32: '...',
}
},
b: {
...
},
};
直接取很简单
var text = obj.a.a3.a31;
根据数组取
var arr = ['a','a3','a31'];
var text = obj[arr[0][arr[1].[arr[2];
我现在的问题是,数组是个变量,如果对象不存在目标属性返回一个空值。
一般的循环数组,逐层判断对象是否在,这个我也会。只是想求个优雅的方法。感谢!

如果单纯的根据一个value取值的话,先indexof(),再substr(), 当然前提是这个value字符是唯一的。 如果是很复杂的嵌套比如:var obj={a:{a:[{a:{a:"b"}}]},b:{b:{b:[{b:{b:{b:"b"}}}]}}}; 要遍历取值的话,以我的认知 也就只能用数组的这种方式了; 你如果还想用骚的东西搞的话,那就试试一些解析器吧,查了一下有个vue.js,你可以研究一下。哈哈...
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-05-22
var obj = {
    a: {
        a3: {
            a31: 1,
        }
    }
};
var arr = ['a', 'a3', 'a31'];

// 返回1
arr.reduce(function (acc, key) { return acc &&  key in acc ? acc[key] : null; }, obj);

var arr2 = ['a', 'a3', 'a32'];
// 返回null
arr2.reduce(function (acc, key) { return acc &&  key in acc ? acc[key] : null; }, obj);

本回答被提问者和网友采纳
第2个回答  2017-05-22
写个函数获取,递归。