1. 程式人生 > >js練習

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'));