今天分享两个
- lodash.get www.npmjs.com/package/lod…
- Idx www.npmjs.com/package/idx
undefined
在写代码的时候,常常会遇到各种undefined,一般就是该存在的字段会因为奇奇怪怪的原因不存在,尤其是调用服务端接口的场景。undefined特别糟心,会阻塞代码执行,抛出异常;甚至会引起渲染异常,白屏等等。

所以在实际操作中,为了避免出现undefined,我们往往会一路判断下去。
variables && variable.propertyA && variable.propertyA.propertyB.
如果数据结构比较简单,而且就一两层还好;但是如果层数特别多,或者含有数组之类的,写起来就难受很多。
variables && variable.propertyA && variable.propertyA.propertyB && variable.propertyA.propertyB[0] && variable.propertyA.propertyB[0].propertyC
防御式编程是个好习惯,但是聪明的你也一定发现了,这样一路判断下来,很恶心不说,还容易遗漏,少了一个判断可能就会跪了。
lodash.get和idx都可以解决这种情况,先看lodash.get.
lodash.get实际上是lodash工具库的一个子集。而lodash是JavaScript生态中非常流行的工具库,类比Java中的Guava/common-utils。很多人喜欢用其中的get模块,但是不想用完整的lodash,所以还有个独立的模块,即lodash.get。 lodash.get的用法实在是非常好懂。官方示例如下:
var object = { 'a': [{ 'b': { 'c': 3 } }] };
_.get(object, 'a[0].b.c');
// => 3
_.get(object, ['a', '0', 'b', 'c']);
// => 3
_.get(object, 'a.b.c', 'default');
// => 'default'
其方法原形为: _.get(object, path, [defaultValue])
有3个变量,第一个为被索引的对象object,第二个为访问属性的路径path,第三个为默认数值defaultValue。其中关键的参数为path。其中path为a[0].b.c的时候,其含义为属性a为数组,取属性a的第一个元素,并进一步获取该元素下的属性b,属性b下的属性c。
那前面提到的例子,如果用lodash.get,该怎么写呢?
// pure javascript
variables && variable.propertyA && variable.propertyA.propertyB && variable.propertyA.propertyB[0] && variable.propertyA.propertyB[0].propertyC
// lodash.get
_.get(variables, ‘propertyA.propertyB[0].propertyC’)
怎么样,是不是非常简单,而且可靠性和易读性也变好了。一旦掌握并且使用习惯,就再也回不去了。
同样的,idx的作用是一样,只是使用方法稍有不同。
// idx
idx(variables, _ => _.propertyA.propertyB[0].propertyC)
聪明的你一定注意到了,lodash.get通过字符串类型的path入参去定位要访问的属性,而idx则是函数式样的访问。
哪个更好呢?如果从下载量上看,无疑是lodash.get的使用人数会更多,但是实际上实现的功能是同样的,看个人的喜好。