Math/Data/Array

  • 關鍵詞:Math對象、Data對象、數組Array

一、Math任務

1. 編寫函數,功能:返回從min到max之間的隨機整數,包括min不包括max

  • 代碼如下
function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min)) + min;
}
  • 備注說明
Math.random()  // 返回一個從0到1之間的偽隨機數:可以等于0,一定小于1
Math.floor()  // 返回小于或等于參數的最大整數
Math.random() * (max - min)  // 最小值為 0 ,最大值無限接近 差值 -1
Math.floor(Math.random() * (max - min))  // 最小值為 0,最大值為 差值 -1
Math.floor(Math.random() * (max - min)) + min  // 最小值為 min,最大值為 max-1

2. 編寫函數,功能:返回從min都max之間的隨機整數,包括min包括max

  • 代碼如下
function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
  • 備注說明
Math.random() * (max - min + 1)  // 最小值為 0 ,最大值無限接近 差值 +1
Math.floor(Math.random() * (max - min + 1))  // 最小值為 0,最大值為 差值
Math.floor(Math.random() * (max - min + 1)) + min  // 最小值為 min,最大值為 max

3. 編寫函數,功能:生成一個長度為 n 的隨機字符串,字符串字符的取值范圍包括0到9,a到 z,A到Z

  • 思路
// 1. 字符串可以通過類數組下標的方法進行訪問
// 2. 類數組下標可以通過 Math.random() 隨機生成
// 3. 建立一個字典和一個空字符串,從字典中隨機篩選字符放入空字符串中
// 4. 利用循環控制所要字符串的長度
// 5. 注意取值范圍和要求
  • 代碼如下
function getRandStr(len){ 
//補全函數
    var disc = '1234567890abcdefjhigklmnopqrstuvwxyzABCDEFJHIGKLMNOPQRSTUVWXYZ'
    var str = ''
    for(var i = 0; i < len; i++){
        str += disc[Math.floor(Math.random() * 62)]  
        // (62+1)會出現undefined,原因 disc 共有62位,但第62位的下標是disc[61],第1位的下標是disc[0]【注意位數與下標的關系:下標 = 位數 - 1】
    }
    return str
}
var result = getRandStr(15)
console.log(result)  // mcwNMWGbbEmwodq
console.log(result.length)  // 15

4. 編寫函數,功能:生成一個隨機 IP 地址,一個合法的 IP 地址為 0.0.0.0~255.255.255.255

  • 思路
// 直接循環、隨機生成4個數字,使用連接符連接4個數字
// 第一將循環結果push到數組中,第二將數組轉化為字符串
  • 代碼如下
function getRandIP(){
//函數補全
    var str = []
    for(var i = 0; i < 4; i++){
        str.push(Math.floor(Math.random() * (255+1)))
    }
    var strIp = str.join('.')
    return strIp
}
var ip = getRandIP()
console.log(ip)  // 101.11.140.65

5. 編寫函數,功能:生成一個隨機顏色字符串,合法顏色為#000000~ #ffffff

  • 思路
// 制作字典,篩選字符
// 循環 6 次,每次生成 1 個字符,組裝顯示
  • 代碼如下
function getRandColor(){
    var disc = '1234567890abcdef'
    var str = ''
    for(var i = 0; i < 6; i++){
        str += disc[Math.floor(Math.random() * 16 )]
    }
    var show = '#' + str
    return show
}
var color = getRandColor()
console.log(color)  // #4a8e36

二、數組任務

1.1 數組方法里push、pop、shift、unshift、join、split分別是什么作用?

方法 作用
push 向數組的末尾添加一個或多個元素,并返回新的長度,直接修改原數組
pop 刪除并返回數組的最后一個元素,數組長度減 1,直接修改原數組
shift 刪除數組的第一個元素,并返回第一個元素的值,直接修改原數組
unshift 向數組的開頭添加一個或更多元素,并返回新的長度,直接修改原數組
join 把數組中的所有元素放入一個字符串中,元素通過指定分隔符進行分隔
split 把一個字符串分割成字符串數組,字符串通過指定點進行分割
splice 向/從數組中添加/刪除項目,然后返回被刪除的項目,直接修改原數組

1.2 用 splice函數分別實現 push、pop、shift、unshift方法

  • splice:向數組中添加元素,或從數組中刪除元素
語法:arrayObject.splice(index, howmany, item1,.....,itemX)
參數說明:
 1. index:必填;整數;定義起始位置;若為負數,起始位置從尾部開始計算
 2. howmany:必填;需要刪除的元素數量;若為 0,則不刪除任何元素
 3. itemX:選填;向數組添加的新元素;數量可為多個
  • 1.push:向數組末尾添加一個或多個元素【堆棧】
var arr1 = new Array(1,2,3,4,5)
arr1.splice(arr.length, 0, 6)
console.log(arr1)  // [1, 2, 3, 4, 5, 6]
  • 2.pop:刪除數組末尾最后一個元素【堆棧】
var arr2 = new Array(1,2,3,4,5)
arr2.splice(arr.length-1, 1)
console.log(arr2)  // [1, 2, 3, 4]
  • 3.shift:刪除數組開頭第一個元素【隊列】
var arr3 = new Array(1,2,3,4,5)
arr3.splice(0, 1)
console.log(arr3)  // [2, 3, 4, 5]
  • 4.unshift:向數組開頭添加一個或多個元素【隊列】
var arr4 = new Array(1,2,3,4,5)
arr4.splice(0, 0, 0)
console.log(arr4)  // [0, 1, 2, 3, 4, 5]

2. 編寫函數,功能:操作數組,數組中的每一項變為原來的平方,操作原數組

  • 思路
// 遍歷數組 { 計算平方 }
// 循環時:將平方結果賦值替換原數組元素 —— 使用數組下標
  • 代碼如下
function squareArr(arr){
    // 函數補全
    for(var i = 0; i < arr.length; i++){
      arr[i] = Math.pow(arr[i], 2)  
      // arr[i] = arr[i] * arr[i]   // 指定每一項的保存位置
    }
    return arr
}
var arr = [2, 4, 6]
squareArr(arr)
console.log(arr) // [4, 16, 36]

3. 編寫函數,功能:操作數組,返回一個新數組,新數組中只包含正數,原數組不變

  • 思路
// 遍歷數組 { 條件判斷 }
// 聲明新空數組保存值,最終return值
  • 代碼如下
function filterPositive(arr){
    //函數補全
    var emptyArr = []
    for(var i = 0; i < arr.length; i++){
      if( typeof arr[i] === 'number' && arr[i] > 0){  // 只需要數字,且是正數
        emptyArr.push( arr[i] )  // .push 將 參數 添加到 指定數組中(emptyArr)
      }
    }
    return emptyArr
}
var arr = [3, -1,  2,  '饑人谷', true]
var newArr = filterPositive(arr)
console.log(arr)  // [3, -1, 2, '饑人谷', true]
console.log(newArr)  // [3, 2]

三、Date 任務

1. 編寫函數getChIntv,獲取從當前時間到指定日期的間隔時間

  • 思路
// 1. 分別獲取當前時間、指定時間,并計算差值
// 2. 轉換差值顯示格式:毫秒數轉換為指定格式
// 3. 以北京時間 0 為基準
  • 代碼如下
function getChIntv(time){
    var endLine = Date.parse(time)            // 1.傳遞指定時間
    var startLine = Date.now()                // 2.獲取當前時間
    var interval = endLine - startLine        // 3.計算時間間隔(可使用Math.abs())
    var secondsAll = parseInt(interval/1000)  // 4.全部秒數(需要整數進行計算)
    var seconds = secondsAll % 60             // 5.換算秒數
    var minutesAll = parseInt(secondsAll/60)  // 6.全部分鐘數
    var minutes = minutesAll % 60             // 7.換算分鐘數
    var hoursAll = parseInt(minutesAll/60)    // 8.全部小時數
    var hours = hoursAll % 24                 // 9.換算小時數
    var daysAll = parseInt(hoursAll/24)       //10.全部天數
    var str = ''
    return var str = '距除夕還有 ' + Math.abs(daysAll) + ' 天 ' + Math.abs(hours-8) + ' 時 ' + Math.abs(minutes) + ' 分 ' + Math.abs(seconds) + ' 秒'
}
var str = getChIntv("2017-01-27");
console.log(str);  // 距除夕還有 10 天 6 時 30 分 6 秒
  • 記錄 /已過去/ 或 /未到來/ 的某個重要日子
// 根據條件顯示不同提示:替換上面 return 語句
if((endLine - startLine) > 0){            
    return str = '距 ' + time + ' 還剩下 ' + Math.abs(daysAll) + ' 天 ' + Math.abs(hours-8) + ' 時 ' + Math.abs(minutes) + ' 分 ' + Math.abs(seconds) + ' 秒'
}else {
    return str = '距 ' + time + ' 已過去 ' + Math.abs(daysAll+1) + ' 天 ' + Math.abs(hours-8) + ' 時 ' + Math.abs(minutes) + ' 分 ' + Math.abs(seconds) + ' 秒'
}
  • 題外話
UTC 和 GMT 都是世界標準時間, 兩者差距很小:UTC = GMT +/- 0.9 s 
北京時間比UTC時間早8小時,例如:UTC時間是2017年1月1日0點整,北京時間是2017年1月1日早8點整

2. 編寫函數getChsDate,功能:轉換日期格式,把hh-mm-dd格式數字日期改成中文日期

  • 思路
 1. 定義數組字典
 2. 利用數組下標篩選字典元素
 3. 字典種類:字符串、數組;
     字符串中每一個字對應一個下標;數組中每一個元素對應一個下標
     字符串字典只有0~10準確;數組字典任意數字都比較精確
  • 代碼如下
function getChsDate(date){
    var arr = date.split('-')
    var disc = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十', '二十一', '二十二', '二十三', '二十四', '二十五', '二十六', '二十七', '二十八', '二十九', '三十', '三十一']
    var year = ''
    for(var i = 0; i < arr[0].length; i++){
        year += disc[arr[0][i]]
    }
    var month = disc[parseInt(arr[1])]  // 需要轉換為整數
    var day = disc[parseInt(arr[2])]
    var result = ''
    return result = year + '年' + month + '月' + day + '日'
}
var str = getChsDate('2015-01-08');
console.log(str);  // 二零一五年一月八日

3. 編寫函數,功能:按參數條件返回字符串

  • 參數為時間對象毫秒數的字符串格式,返回值為字符串。
假設參數為時間對象毫秒數 t,根據 t 的時間分別返回如下字符串:
 1. 剛剛( t 距當前時間不到1分鐘時間間隔)
 2. 3分鐘前 (t距當前時間大于等于1分鐘,小于1小時)
 3. 8小時前 (t 距離當前時間大于等于1小時,小于24小時)
 4. 3天前 (t 距離當前時間大于等于24小時,小于30天)
 5. 2個月前 (t 距離當前時間大于等于30天小于12個月)
 6. 8年前 (t 距離當前時間大于等于12個月)
  • 思路
 1. 轉換參數(毫秒數)為秒數、分鐘數、小時數、天數
 2. 加入條件判斷,根據條件返回相應字符串
 3. 判斷這個差值符合哪個條件,就返回哪個字符串
  • 代碼
function friendlyDate(time){
    var stare = Date.now()
    secondsAll = Math.abs(stare - time) / 1000
    if(secondsAll < 60){  // 秒數;條件判斷使用向上乘法更好一些,不用轉換整數
        return '剛剛'
    }else if(parseInt(secondsAll/60) >= 1 && parseInt(secondsAll/60) < 60){  // 分鐘數
        return '3分鐘前'
    }else if(parseInt(secondsAll/60/60) >= 1 && parseInt(secondsAll/60/60) < 24){  // 小時數
        return '8小時前'
    }else if(parseInt(secondsAll/60/60/24) >= 1 && parseInt(secondsAll/60/60/24) < 30){  // 天數
        return '3天前'
    }else if(parseInt(secondsAll/60/60/24/30) >= 1 && parseInt(secondsAll/60/60/24/30) < 12){  // 月數
        return '2個月前'
    }else if(parseInt(secondsAll/60/60/24/30/12) >= 1){  // 年數
        return '8年前'
    }
}
var time = Date.parse('2017-01-01')
var str = friendlyDate(time)
console.log(str)  // 3天前

本文章著作權歸饑人谷和作者所有,轉載須說明來源!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,762評論 0 33
  • .寫一個函數,返回從min到max之間的 隨機整數,包括min不包括max function randomness...
    邢烽朔閱讀 326評論 0 1
  • Math任務 1、寫一個函數,返回從min到max之間的 隨機整數,包括min不包括max function ge...
    saintkl閱讀 303評論 0 0
  • 參考 Math任務 1、寫一個函數,返回從min到max之間的 隨機整數,包括min不包括max// Math....
    怎么昵稱閱讀 244評論 0 0
  • Math任務 1、寫一個函數,返回從min到max之間的隨機整數,包括min不包括max
    湖衣閱讀 278評論 0 0