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阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,658评论 0 33
  • .写一个函数,返回从min到max之间的 随机整数,包括min不包括max function randomness...
    邢烽朔阅读 287评论 0 1
  • Math任务 1、写一个函数,返回从min到max之间的 随机整数,包括min不包括max function ge...
    saintkl阅读 264评论 0 0
  • 参考 Math任务 1、写一个函数,返回从min到max之间的 随机整数,包括min不包括max// Math....
    怎么昵称阅读 212评论 0 0
  • Math任务 1、写一个函数,返回从min到max之间的随机整数,包括min不包括max
    湖衣阅读 245评论 0 0