在Vue1.x版本里有个vm.$get(expression)方法,可以根据表达式获取vm上绑定的数据的值,并能进行一些简单的算术运算。在Vue2的版本里,这个方法被废弃了。但是在一些特殊场景下,我们可能还是需要这样一种方便获取对象属性值的方法。

比如有下面这样一个对象:

1
2
3
4
5
6
7
8
9
10
11
var obj = {
aa: 1,
bb: {
xx: 0,
oo: null,
yy: 2,
zz: {
ww: 6
}
}
}

我们想实现一个方法:

1
2
3
var getObjectValue = function (o, exp) {
// todo
}

只需这样调用就可以直接输出对象的属性值:

1
2
3
4
5
getObjectValue(obj, 'aa') // 1
getObjectValue(obj, 'bb.xx') // 0
getObjectValue(obj, 'bb.zz.ww') // 6
getObjectValue(obj, 'bb.oo') //null
getObjectValue(obj, 'bb.oo.bar') // undefined 当获取一个不存在的属性值时

完整的代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var getObjectValue = (function (undefined) {
return function (o, exp) {
if (o == null || typeof exp !== 'string') return

var parts = exp.trim().split('.')
var len = parts.length
for (var i = 0; i < len; i++) {
if (o[parts[i]] !== undefined) {
if (o[parts[i]] === null) {
return i < len - 1 ? undefined : null
}
o = o[parts[i]]
} else {
return
}
}
return o
}
})()