js练习

/**
 * Created by bianxiaoling on 2018/9/7.
 */
//2
// 获取 url 中的参数
// 1. 指定参数名称,返回该参数的值 或者 空字符串
// 2. 不指定参数名称,返回全部的参数对象 或者 {}
// 3. 如果存在多个同名参数,则返回数组
// 示例1
// 输入
// http://www.nowcoder.com?key=1&key=2&key=3 test=4#hehe
//     输出
//         [1, 2, 3]
function getUrlParam(sUrl, sKey) {
    //#号后面的不截取通不过split("#")
    var oKey = sUrl.split("?")[1].split("#")[0].split("&");
    var rObj = {};

        for(var i = 0;i<oKey.length;i++){
            var keyVal = oKey[i].split("=");
            if(!rObj[keyVal[0]] && rObj[keyVal[0]] !==""){
                if(keyVal.length == 1 && oKey[i].indexOf("=") >0){
                    rObj[keyVal[0]] = "";
                }
                else if(keyVal.length == 1 && oKey[i].indexOf("=") <0){
                    rObj[keyVal[0]] = undefined;
                }
                else{
                    rObj[keyVal[0]] =   keyVal[1];
                }
            }
            else {
                if(rObj[keyVal[0]] instanceof Array){
                    rObj[keyVal[0]].push(keyVal[1]);
                }
                else{
                    rObj[keyVal[0]] = [rObj[keyVal[0]]];
                    rObj[keyVal[0]].push(keyVal[1]);
                }
            }
        }
    if(!sKey){
        return rObj;
    }
    else{
        return rObj[sKey]?rObj[sKey]:"";
    }
}

console.log(getUrlParam("http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe"));//{key:["1","2","3"],test:"4"}

//3
// 查找两个节点的最近的一个共同父节点,可以包括节点自身
// 输入描述:
//     oNode1 和 oNode2 在同一文档中,且不会为相同的节点
function commonParentNode(oNode1, oNode2) {
    if(oNode1.contains(oNode2)){
        return oNode1;
    }else{
        return commonParentNode(oNode1.parentNode,oNode2);
    }
}

//4
// 根据包名,在指定空间中创建对象
// 输入描述:
//     namespace({a: {test: 1, b: 2}}, 'a.b.c.d')
// 输出描述:
// {a: {test: 1, b: {c: {d: {}}}}}
function namespace(oNamespace, sPackage) {
    var arr = sPackage.split('.');
    var res = oNamespace;   // 保留对原始对象的引用
    for(var i = 0, len = arr.length; i < len; i++) {
        if(arr[i] in oNamespace) {  // 空间名在对象中
            if(typeof oNamespace[arr[i]] !== "object") {    // 为原始值
                oNamespace[arr[i]] = {};    // 将此属性设为空对象
            }
        } else {    // 空间名不在对象中,建立此空间名属性,赋值为空
            oNamespace[arr[i]] = {};
        }
        oNamespace = oNamespace[arr[i]];    // 将指针指向下一个空间名属性。
    }
    return res;
}
console.log(namespace({a: {test: 1, b: 2}}, 'a.b.c.d'));

//5
// 为 Array 对象添加一个去除重复项的方法
// 示例1
// 输入
//     [false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]
// 输出
//     [false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']
Array.prototype.uniq = function () {
    var rem = [],
        flag = true;//NaN=存在的标志
    for(var i=0;i<this.length;i++){
        if(rem.indexOf(this[i]) == -1){
            if(this[i] != this[i]){//NaN
                if(flag){
                    rem.push(this[i]);
                    flag = false;
                }
            }
            else{
                rem.push(this[i]);
            }
        }
    }
    return rem;
}
console.log([false,false, true, undefined, undefined,null, null,NaN, 0, 1, {}, {}, 'a', 'a', "b","b",NaN]);
console.log([false,false, true, undefined, undefined,null, null,NaN, 0, 1, {}, {}, 'a', 'a', "b","b",NaN].uniq());

//6
// 按所给的时间格式输出指定的时间
//
// 格式说明
// 对于 2014.09.05 13:14:20
// yyyy: 年份,2014
// yy: 年份,14
// MM: 月份,补满两位,09
// M: 月份, 9
// dd: 日期,补满两位,05
// d: 日期, 5
// HH: 24制小时,补满两位,13
// H: 24制小时,13
// hh: 12制小时,补满两位,01
// h: 12制小时,1
// mm: 分钟,补满两位,14
// m: 分钟,14
// ss: 秒,补满两位,20
// s: 秒,20
// w: 星期,为 ['日', '一', '二', '三', '四', '五', '六'] 中的某一个,本 demo 结果为 五
//
// 示例1
// 输入
// formatDate(new Date(1409894060000), 'yyyy-MM-dd HH:mm:ss 星期w')
// 输出
// 2014-09-05 13:14:20 星期五



//7
// 如果第二个参数 bUnicode255For1 === true,则所有字符长度为 1
// 否则如果字符 Unicode 编码 > 255 则长度为 2
//
// 示例1
// 输入
// 'hello world, 牛客', false
// 输出
// 17
function strLength(s, bUnicode255For1) {
    var len = s.length;
    if(bUnicode255For1)
        return len;
    else{
        for(var i=0; i<s.length;i++){
            if(s.charCodeAt(i)>255){
                len++;
            }
        }
        return len;
    }
}

console.log(strLength('hello world, 牛客', false));

//8.
// 判断输入是否是正确的邮箱格式
// 输入描述:
//     邮箱字符串
// 输出描述:
//     true表示格式正确
function isAvailableEmail(sEmail) {
    var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/;
    return reg.test(sEmail);
}

console.log(isAvailableEmail("[email protected]"));

// 9
// 将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff
// 1. rgb 中每个 , 后面的空格数量不固定
// 2. 十六进制表达式使用六位小写字母
// 3. 如果输入不符合 rgb 格式,返回原始输入
//
// 示例1
// 输入
// 'rgb(255, 255, 255)'
// 输出
// #ffffff
function rgb2hex(sRGB) {

}

//10
// css 中经常有类似 background-image 这种通过 - 连接的字符,通过 javascript 设置样式的时候需要将这种样式转换成 backgroundImage 驼峰格式,请完成此转换功能
// 1. 以 - 为分隔符,将第二个起的非空单词首字母转为大写
// 2. -webkit-border-image 转换后的结果为 webkitBorderImage
//
// 示例1
// 输入
// 'font-size'
// 输出
// fontSize
function cssStyle2DomStyle(sName) {
    //判断字符串sName[0]是否为"-"
        if(sName.indexOf("-") == 0){
            sName = sName.substring(1);
        }
        var rem = sName.split("-"),newRem = [];
        for(var i=1;i<rem.length;i++){
            newRem.push(rem[i].slice(0,1).toUpperCase() +rem[i].slice(1));
        }
        newRem.unshift(rem[0]);
        return newRem.join("");
}

console.log(cssStyle2DomStyle('font-size-ddd-sdd'));

//11
// 统计字符串中每个字符的出现频率,返回一个 Object,key 为统计字符,value 为出现频率
// 1. 不限制 key 的顺序
// 2. 输入的字符串参数不会为空
// 3. 忽略空白字符
//
// 示例1
// 输入
// 'hello world'
// 输出
// {h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1}
function count(str) {
    var rObj = {};
    for(var i=0;i<str.length;i++){
        if(str[i] in rObj){
            rObj[str[i]]++;
        }
        else{
            rObj[str[i]] = 1;
        }
    }
    return rObj;
}

console.log(count('hello world'));

猜你喜欢

转载自www.cnblogs.com/bxlbear/p/9628833.html