一道面试题引起的思考

 今天在认真干(划)活(水)的时候,看到群里有人发了一道头条的面试题,就顺便看了一下,发现挺有意思的,就决定分享给大家,并且给出我的解决方案和思考过程。

题目如下:

实现一个get函数,使得下面的调用可以输出正确的结果

const obj = { selector: { to: { toutiao: "FE Coder"} }, target: [1, 2, { name: 'byted'}]};  get(obj, 'selector.to.toutiao', 'target[0]', 'target[2].name'); // [ 'FE Coder', 1, 'byted']

乍眼一看,这不就是实现一个lodash.get方法吗?看上去好像很简单。所以我就开始写了第一个版本。思想其实很简单,遍历传进来的参数,使用split将每一个参数分隔开,然后遍历取值,最终返回结果。

function get(data, ...args) {     return args.map((item) => {         const paths = item.split('.');         let res = data;         paths.map(path => res = res[path]);         return res;     }) }

一运行,果不其然,报错了。

后来仔细看了一下提供的测试代码,发现居然有target[0]这种东西。。居然还带了个数组索引。

冷静分析一下,对于后面带了个索引的类型,比如'target[0]',我们肯定是要特殊对待的。所以,我们首先得先识别到这种特殊的类型,然后再对它进行额外处理。

这个时候,很快的就可以想到使用正则表达式来做这个事情。为什么呢?因为像这种带有索引的类型,他们都有一个特色,就是有固定的格式:[num],那么我们只需要能构造出可以匹配这种固定格式的正则,就可以解决这个问题。

对于这种格式,不难想到可以用这个正则表达式来做判断:/\[[0-9]+\]/gi,可是我们还需要将匹配值取出来。这个时候查了下正则表达式的文档(文档点击这里),发现有一个match方法,可以返回匹配成功的结果。那么就让我们来做个测试:

const reg = /\[[0-9]+\]/gi; const str = "target[123123]"; const str1 = "target[]"  if (reg.test(str)) {     console.log('test success'); }  if (!reg.test(str1)) {     console.log('test fail'); }  const matchResult = str.match(reg); console.log(matchResult); // ["[123123]"]

诶,我们现在已经找到了解决这种问题的方法,那让我们赶紧来继续改进下代码。

function get(data, ...args) {     const reg = /\[[0-9]+\]/gi;     return args.map((item) => {         const paths = item.split('.');         let res = data;         paths.map((path) => {                   if (reg.test(path)) {                     const match = path.match(reg)[0];                     // 将target[0]里的target储存到cmd里                     const cmd = path.replace(match, '');                     // 获取数组索引                     const arrIndex = match.replace(/[\[\]]/gi, '');                     res = res[cmd][arrIndex];                   } else {                     res = res[path];                   }         });         return res;     }); }   const obj = { selector: { to: { toutiao: "FE Coder"} }, target: [1, 2, { name: 'byted'}]};  c
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信