shopee面试代码题
- 第一道是仿JSON.parse
json_parse("[12,[[3],45,6,7],8,9]")
https://blog.51cto.com/u_11658127/3396506
直接从这简化
var json_parse = function () {
var at = 0, // 当前字符的索引
ch = ''; // 当前字符
var next = function (c) {
// 如果提供了参数c, 那么检查它是否匹配当前字符
if (c && c !== ch) {
error("Expected '" + c + "' instead of '" + ch + "'");
}
// 获取下一个字符。当没有下一个字符时, 返回一个空字符串
ch = text.charAt(at);
at += 1;
return ch;
}
var number = function () {
// 解析一个数字值
var number, string = '';
while (ch >= '0' && ch <= '9') {
string += ch;
next();
}
number = +string;
if (isNaN(number)) {
console.error("Bad number");
} else {
return number;
}
}
var white = function () {
// 跳过空白
while (ch && ch <= ' ') {
next();
}
}
var array = function () {
// 解析一个数组值
var array = [];
if (ch === '[') {
next('[');
white();
if (ch === ']') {
next(']');
return array; // 空数组
}
while (ch) {
array.push(value());
white();
if (ch === ']') {
next(']');
return array;
}
next(',');
white();
}
}
error("Bad array");
}
var value = function () {
// 解析一个JSON 值 它可以是对象数组、字符串、数字或一个词
white();
switch (ch) {
case '[':
return array();
default:
return number()
}
};
return function (source, reviver) {
var result;
text = source;
at = 0;
ch = ' ';
result = value();
white();
if (ch) {
error("Syntax error");
}
return result
}
}();
var res = json_parse("[12,[[3],45,6,7],8,9]")
console.log(res)
简化下:
var array_parse = function(str){
var at = 0
var ch = str[0]
var next = function(){
at++;
ch = str.charAt(at)
}
var array = function(){
var array = []
if(ch == '['){
next()
if (ch === ']') {
next();
return array; // 空数组
}
while (ch) {
array.push(value());
if (ch === ']') {
next();
return array;
}
next();
}
}
}
var number = function(){
var number, string = '';
while (ch >= '0' && ch <= '9') {
string += ch;
next();
}
number = +string;
if (isNaN(number)) {
console.error("Bad number");
} else {
return number;
}
}
var value = function(){
switch(ch){
case '[':
return array()
default:
return number();
}
}
var result = value()
return result
}
console.log(array_parse("[23,4,[7,56,[8]],6]"))
- 实现一个cache函数
function cache(fn){
// TO-DO
var res ={}
return function(){
var arg = arguments[0]
console.log(arg)
if(res[arg]){
console.log('走的缓存')
return res[arg]
}else{
res[arg] = fn.call(null,arg)
return res[arg]
}
}
}
function complexCal(a){
//这里有复杂计算
return a
}
var combine = cache(complexCal)
combine(1)
combine(2)
combine(1)