- 现有对象如下
let obj = {a: {b:{c:{d:'Marron'}}}
}
- 想通过一个方法,输入该对象和路径
a.b.c.d
获取Marron的值
【思路】:
- 首先使用split数据,将
a.b.c.d
变为[a, b, c, d]
- 然后使用
shift()
方法每次取出最前面的属性名,存放在prop
中 - 新建一个
res
对象,让res = res[prop]
- 现假设有一函数如下:
var f = function(obj, path){let res = obj,currProp,props = path.split('.');// [a, b, c, d]while(currProp = props.shift()){res = res[currProp] }return res
}
let obj = {a: {b:{c:{d:'Marron'}}}
}
console.log(f(obj, 'a.b.c.d')) // Marron
- 上面已经成功的实现了基本的需求.但是如果传入的路径是错误的.有可能会报错.
- 栗子:
console.log(f(obj, 'a.c.d.e'))
Uncaught TypeError: Cannot read property ‘d’ of undefined
【解决办法】:
在进行res = res[currProp]
时,首先判断res[currProp]
是否为undefined:
- 若是,则
return undefined
- 否则才进行下一步
- 改进后的代码如下:
var f = function(obj, path){let res=obj,currProp,props = path.split('.');// [a, b, c, d]while(currProp = props.shift()){if(!res[currProp]){return undefined} else {res = res[currProp] }}return res
}
let obj = {a: {b:{c:{d:'Marron'}}}
}
console.log(f(obj, 'a.c.d.e'))
console.log(obj)