javascript --- > 对象属性的深层次获取

  • 现有对象如下
let obj = {
	a: {
		b:{
			c:{
				d:'Marron'
			}
		}
	}
}
  • 想通过一个方法,输入该对象和路径a.b.c.d获取Marron的值
    【思路】:
  1. 首先使用split数据,将a.b.c.d变为[a, b, c, d]
  2. 然后使用shift()方法每次取出最前面的属性名,存放在prop
  3. 新建一个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)
发布了228 篇原创文章 · 获赞 41 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/piano9425/article/details/104527327