- 現有對象如下
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)