2021
腾讯初面总结
数组扁平化以及DateAPI的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 有如下数组: arr = [ ['2020-09-12'], ['feed2020-09-11cn', ['uin2020-9-14:us'] ], ['feed2020-09-10-uk'], ['list2011-09-13jp'], ['fs0-09-13'] ] 请编写函数将其抹平为一位数组,并提取其中的日期输出为时间戳格式
输出: [1599868800000,1599782400000,1600012800000,1599696000000,1315872000000]
|
emmm,这题上来我就不会了,原因是我不知道怎么处理V8的输入嵌套数组…
不过后面也没想输入的事情了,就直接开始写函数,不过也没写出来,哭了😭
后面回宿舍想了想,查了查日期的API,写了个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| const toString = Object.prototype.toString;
const dateReg = /([0-9]{4})-(0[1-9]|1[0-2]|[1-9])-(0[1-9]|[1-2][0-9]|3[0-1]|[1-9])/g
function fn(arr) { const result = []; for (let i = 0; i < arr.length; i++) { if (toString.call(arr[i]) === '[object Array]') { result.push(...fn(arr[i])); } else { const matchArr = arr[i].match(dateReg); if (matchArr) { const d = matchArr[0].split('-'); result.push(Date.UTC(+d[0], (+d[1]) - 1, +d[2])); } } } return result; }
|
但是里面有一个输出有问题,很奇怪,其他的输出都没有什么问题。
输入的样例里面有一个'uin2020-9-14:us'
。
如果返回的是基于UTC(格林威治标准时间)来计算时间戳的话,返回应该是1600041600000
。
挺奇怪的…
可能他在第五层,我连第一层都达不到😂。
现在想起来我为啥要处理输入啊,应该就是写个函数就行了啊,真是傻逼😂。
柯里化加法和乘法
1 2 3 4 5
| 问题:设计实现多次调用的加法与乘法函数,参数不定,调用次数不定。
调用例子: console.log(curryAdd(1)(2)(3)(4)(5)); // 15 console.log(curryMul(2,3)(4)(5)); // 120
|
我当时是这样写的,写完还没写乘法的时候面试官就直接说谈谈了…
1 2 3 4 5 6 7 8 9
| function curryAdd (...args) { return function (...rest) { if(rest.length === 0) { return args.reduce((pre, cur) => pre + cur, 0); } else { return curryAdd(...args, ...rest); } } }
|
写的时候其实很在意下面这两种形式,面完之后感觉可以重写toString
来实现
1 2
| console.log(curryAdd(1)(2)(3)(4)(5)); console.log(curryAdd(1)(2)(3)(4)(5)());
|
可以把柯里化和原函数分隔开
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| function add (...args) { return args.reduce((pre, cur) => pre + cur, 0); }
function curry (fn) { const args = []; let _fn; _fn = function (...rest) { args.push(...rest); return _fn; } _fn.toString = _fn.valueOf = function () { return fn(...args); } return _fn; }
const curryAdd = curry(add); const result = curryAdd(1)(2,3,4)(5); console.log(result); console.log(result + 1);
|
虽然result前面有个f的标志,但不影响使用。
node
下也完全没问题。
缺点就是每一次都要通过curry(add)
来返回一个函数,这样才会产生新参数数组的闭包。
才不会被之前的累计影响。
9.16
号晚上。
突发奇想,又想到了另一个版本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function add(...args) { return args.reduce((pre, cur) => pre + cur, 0); }
function curry(fn) { return function _curry(...args) { function _(...rest) { return _curry(...args, ...rest); }
_.valueOf = function () { return fn(...args); } return _; } }
|
这个版本就没有参数闭包变量的问题了
所以每次调用都是一个新的curry
化链条
而且支持分解操作,很牛逼好吧(开心😀)
测试下
1 2 3
| const curryAdd = curry(add); console.log(+curryAdd(1, 5)(2)); console.log(+curryAdd(1, 5)(2));
|
完美好吧~
实现乘法也就是换个参数而已的事情了。
1 2 3 4 5
| function mul(...args){ return args.reduce((pre, val) => pre * val, 1); }
const curryMul = curry(mul);
|
测试下: