实现 lodash 的_.get

2,292 阅读1分钟

前言

在实际业务开发的时候常常需要嵌套调用对象值的情况,比如obj.a.b.c,正常情况下不会有什么问题,但是如果中间有一节断掉了,比如obj对象就没有a属性,那么会导致直接报错,所以我么一般会这么写 obj && obj.a && obj.a.b && obj.a.b.c 显得特别啰嗦麻烦,所以这时就需要一个get方法,来简化这个步骤,提升容错率

代码

function get(source, path, defaultValue = undefined) {
  // a[3].b -> a.3.b -> [a,3,b]
  const paths = path.replace(/\[(\d+)\]/g, ".$1").split('.')
  
  let result = source;
  for (const key of paths) {
    result = Object(result)[key];
    if(result === undefined) {
      return defaultValue;
    }
  }
  return result;
}

path 中也可能是数组的路径,比如obj.a[0].b,所以需要正则把[]全部转化成.运算符并组成数组。
result = Object(result)[key]; 之所以要包一层Object,因为null 与 undefined 取属性会报错,所以使用 Object 包装一下。