牛客网"前端大挑战"题目解答

185 篇文章 0 订阅
11 篇文章 0 订阅

第一题,获取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);;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值