just-pick函数学习

21 阅读3分钟

这是我学习的第三个just函数,pick
功能是从一个对象里面取出给定的键,这个功能看起来是很简单的,不过我觉得还是有一定的收获

实现

我觉得总体来说就是一步,通过循环给定的键数组,对每一个键进行处理,返回一个新的对象即可
不过在这之前,我觉得有很关键的一步就是对参数进行校验。对于这种通用的功能性函数,我觉得要对参数进行比较严格的校验,或者说要最大程度上保证函数尽量不报错。

// 比如我们的目标对象为null,也就是一个空的
// 然后了解到这个函数的功能,是返回一个新的对象
// 那这个时候我们应该让返回值为一个空对象即可 (如果传入的keys为空,也是如此,应该返回一个空对象)
pick(null, ['a', 'b'])

说到这个参数校验,我刚刚特地去请教了AI。我记得在之前刚刚看了Lodash的源码之后,发现它有一个专门判断类型的方法,可以精确的判断参数的类型,我当时看了之后,其实在很长一段时间里我都会觉得,要对参数进行绝对的类型校验,也就是说必须是这个类型,或者非常严格的限制它的类型,类型不对就直接抛出错误。
但是在现在看来,我发现不是的,在JavaScript中,最特殊的两个值就是null和undefined,null为人为的置空,它就是没有东西。undefined可能是访问某个属性的时候,这个属性不存在。所以其实在一般值校验时,我们都应该考虑到可能出现这两种情况,这是一个比较合理的做法。
也就是说,在这个函数中,比如第一个参数应该是传入一个对象,但是在使用过程中,使用者却传入了一个字符串,这个时候是类型都已经完全错误了。但是这也有可能是从另外的地方拿到的参数传过来的,但是这里也有说法,就是在入口处校验。
什么意思呢?比如pick这个函数的第一个参数,你是从一个接口返回里面拿的,正常情况下它是一个对象,然后你也正常的传给pick函数。但是它也可能不是一个对象,那你就在接口返回,拿到的它时候,你就要对它进行处理了。比如说它如果不是对象,你是否需要抛出错误?还是说你给出一个默认值给它,保证它在接下来的数据处理中不会出错。我觉得这会是一个好方法,那你只需要在入口处处理一次,这样错误就不会深入的业务的内部,导致定位问题更加艰难。

所以我们加上校验,就一共是两步

function pick(obj, value) {
  if (obj == null) return {}
  if (value == null || value.length === 0) return {}

  if (typeof value === 'string') {
    value = [...arguments]
  }

  const result = {}

  const len = value.length
  for (let i = 0; i < len; i++) {
    const key = value[i]
    if (key in obj) {
      result[key] = obj[key]
    }
  }

  console.log("🚀 ~ pick ~ result:", result)
  return result
}

总结

其实我来学习这些函数的本意是学习代码细致的写法,因为我觉得只有自己看的多了,自己才能写的出来。但是我发现写代码的思维也很重要。总之这两者都很重要吧,你要知道写好代码的方法是什么,你还要知道具体怎么写。