牛客网"前端大挑战"题目解答
来源:互联网 发布:网络语弹棉花什么意思 编辑:程序博客网 时间:2024/05/19 16:05
第一题,获取url参数
重点思路:
1、url的组成:需要两次split调用,因为url格式大致为:xxx ? xxx=xxx # xxx
2、由于sKey可能不存在,所以可能需要将所有的key-value都保存在resultMap中并返回。
3、当key只有一个结果的时候返回字符串,有多个结果则需要返回数组。因此需要对map中的value的数据格式进行判断才能进行下一步操作:即if(resultMap[array[0]] instanceof Array)
代码:
function getUrlParam(sUrl, sKey) { var pamamstr = (sUrl.split("?"))[1]; pamamstr = (pamamstr.split("#"))[0]; var pamamArr = pamamstr.split("&"); var resultMap = {}; pamamArr.forEach(function(item){ var array = item.split("="); if(resultMap[array[0]]===undefined){ resultMap[array[0]] = array[1]; }else{ if(resultMap[array[0]] instanceof Array){ resultMap[array[0]].push(array[1]); }else{ var tmp = resultMap[array[0]]; resultMap[array[0]] = [tmp]; resultMap[array[0]].push(array[1]); } } }); if(sKey){ return resultMap[sKey]?resultMap[sKey]:""; }else{ return resultMap; }}
第二题,节点寻找
题目描述:
查找两个节点的最近的一个共同父节点,可以包括节点自身
代码:
function commonParentNode(oNode1, oNode2) { while(oNode1 && oNode1 != document.body){ oNode1.setAttribute("class","findParentNode"); oNode1 = oNode1.parentNode; } while(oNode2 && oNode2 != document.body){ var classMark = oNode2.getAttribute("class"); if(classMark == "findParentNode"){ return oNode2; } oNode2 = oNode2.parentNode; } return document.body;}
第三题,创建对象
根据包名,在指定空间中创建对象
输入描述:
namespace({a: {test: 1, b: 2}}, ‘a.b.c.d’)
输出描述:
{a: {test: 1, b: {c: {d: {}}}}}
function namespace(oNamespace, sPackage) { var sArr = sPackage.split("."); var currentObj = oNamespace; sArr.forEach(function(item){ if(currentObj[item] instanceof Object){ currentObj = currentObj[item]; }else{ currentObj[item] = {}; currentObj = currentObj[item]; } }); return oNamespace;}
第四题,数组去重
为 Array 对象添加一个去除重复项的方法
需要注意,NaN !== NaN
Array.prototype.uniq = function () { var result = []; var hasNaN = true; for(var i = 0;i < this.length;++i){ if(result.indexOf(this[i]) == -1){ if( this[i] != this[i]){ if(hasNaN){ result.push(this[i]); hasNaN = false; } }else{ result.push(this[i]); } } } return result;}
第五题,斐波那伽数列(兔子数列哦哈哈)
function fibonacci(n) { if( n==1 || n==2 ){ return 1 } return arguments.callee(n-1) + arguments.callee(n-2);}
第六题,时间格式化
参考了大神代码:
function formatDate(t, sFormation) { var str=''; var obj = { yyyy:t.getFullYear(), yy:(""+ t.getFullYear()).slice(-2), M:t.getMonth()+1, MM:("0"+ (t.getMonth()+1)).slice(-2), d:t.getDate(), dd:("0" + t.getDate()).slice(-2), H:t.getHours(), HH:("0" + t.getHours()).slice(-2), h:t.getHours() % 12, hh:("0"+t.getHours() % 12).slice(-2), m:t.getMinutes(), mm:("0" + t.getMinutes()).slice(-2), s:t.getSeconds(), ss:("0" + t.getSeconds()).slice(-2), w:['日', '一', '二', '三', '四', '五', '六'][t.getDay()] } return sFormation.replace(/([a-z]+)/ig,function($1){return obj[$1]});}
replace函数的使用还有obj对象的建立是亮点!
date对象方法见链接:http://www.w3school.com.cn/jsref/jsref_obj_date.asp
replace方法参数详解:http://www.w3school.com.cn/jsref/jsref_replace.asp
第七题,获取字符串长度
如果第二个参数 bUnicode255For1 === true,则所有字符长度为 1
否则如果字符 Unicode 编码 > 255 则长度为 2
输入示例:strLength(‘hello world, 牛客’, false)
function strLength(s, bUnicode255For1) { if(bUnicode255For1){ return s.length; }else{ var arr = s.split(""); var add = 0; arr.forEach(function(item){ if(item.charCodeAt(0)>255){ add++; } }); return (s.length + add); }}
第八题,邮箱字符串判断
function isAvailableEmail(sEmail) { return /^[\w*\.*]+@[\w*\.*]+.[\w*\.*]$/.test(sEmail);}
第九题,颜色字符串转换
将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff
1. rgb 中每个 , 后面的空格数量不固定
2. 十六进制表达式使用六位小写字母
3. 如果输入不符合 rgb 格式,返回原始输入
栗子:rgb2hex(‘rgb(255, 255, 255)’)
本题重点:
1、使用字符串的方法match
2、判断数字是否符合要求
3、number.toString(16)返回16进制的字符串结果
function rgb2hex(sRGB) { var reg = /rgb\((\d+),\s*(\d+),\s*(\d+)\)/; var arr = sRGB.match(reg); if(!arr){ return sRGB; }else{ var res = "#"; for(var i = 1; i < 4; i++){ var m = parseInt(arr[i]); if(m<0||m>255){ return sRGB; }else{ res += m<16? "0"+m.toString(16):m.toString(16); } } return res; }}
第十题,将字符串转换为驼峰格式
css 中经常有类似 background-image 这种通过 - 连接的字符,通过 javascript 设置样式的时候需要将这种样式转换成 backgroundImage 驼峰格式,请完成此转换功能
1. 以 - 为分隔符,将第二个起的非空单词首字母转为大写
2. -webkit-border-image 转换后的结果为 webkitBorderImage
function cssStyle2DomStyle(sName) { var arr = sName.split("-"); var result = ""; arr.forEach(function(str){ str = str.slice(0,1).toUpperCase() + str.slice(1); result += str; }); return result.slice(0,1).toLowerCase() + result.slice(1);;}
- 牛客网"前端大挑战"题目解答
- 牛客网前端大挑战修改this指向
- 前端常见面试题目解答
- 牛客网前端技能大挑战(dom节点查找)
- 阿里巴巴Web前端面试的一道JS题目,求解答!!!
- 题目解答
- 挑战代码淘宝UED前端智勇大冲关第二季
- 面试10大算法汇总+常见题目解答
- 面试10大算法汇总+常见题目解答
- 面试10大算法汇总+常见题目解答
- 面试10大算法汇总+常见题目解答
- 面试10大算法汇总+常见题目解答
- 面试10大算法汇总+常见题目解答
- 面试10大算法汇总+常见题目解答
- 面试10大算法汇总+常见题目解答
- 面试10大算法汇总+常见题目解答
- 面试10大算法汇总+常见题目解答
- 面试10大算法汇总+常见题目解答
- 【序列】列表
- JAVA控制执行流程学习过程
- tcp/ip和udp之间的区别
- ZBrushCore究竟简化了什么
- Anroid_自定义笑脸View
- 牛客网"前端大挑战"题目解答
- 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结
- CString转string
- Codeforces Gym 100623I Problem I. Important Wires
- java_匿名内部类
- View的工作原理
- React Native 从入门到原理
- 《Android开发艺术探索》读书笔记----第一章:Activity的启动模式
- pcl 学习2 利用矩阵转移一个点云