本节作业之封装自己的数学对象、猜数字、倒计时效果、筛选数组、数组去重、返回字符位置、统计出现最多的字符和次数
1 Math对象案例
封装自己的数学对象
// 利用对象封装自己的数学对象,里面有PI 最大值和最小值
var myMath = {
PI: 3.141592653,
max: function() {
var max = arguments[0];
for(var i = 1; i < arguments.length; i++) {
if (arguments[i] > max) {
max = arguments[i];
}
}
return max;
},
min: function() {
var min = arguments[0];
for(var i = 1; i < arguments.length; i++) {
if (arguments[i] < min) {
min = arguments[i];
}
}
return min;
}
}
console.log(myMath.PI);
console.log(myMath.max(1,5,9));
console.log(myMath.min(1,5,9));
猜数字游戏
程序随机生成一个1~10之间的数字,并让用户输入一个数字。
1.如果大于该数字,就提示:数字大了,继续猜。
2.如果小于该数字,就提示:数字小了,继续猜。
3.如果等于该数字,就提示:猜对了,结束程序。
// 案例分析
// 1.随机生成一个1~10的整数,我们需要用到Math.random()方法
// 2.需要一直猜到正确为止,所以一直循环
// 3.用while循环合适,更简单
// 4.核心算法:使用if else if多分支语句来判断大于、小于、等于
function getRandom(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
var random = getRandom(1,10);
while(true) { //死循环
var num = prompt('你来猜?\n输入1~10之间的一个数字');
if (num > random) {
alert('数字大了');
} else if (num < random) {
alert('数字小了');
} else {
alert('猜对了!');
break; // 退出整个循环,结束程序
}
}
要求用户猜1~50之间的一个数字,但是只有10次猜的机会
function getRandom(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
var random = getRandom(1,50);
for (var i = 1; i <= 10; i++) {
var num = prompt('你来猜?\n输入1~50之间的一个数字');
if (num > random) {
alert('数字大了');
} else if (num < random) {
alert('数字小了');
} else {
alert('猜对了!');
break; // 退出整个循环,结束程序
}
if (i == 10) {
alert('抱歉,你的次数已用完');
}
}
2 Date对象案例
倒计时效果
// 案例分析
// 1.核心算法:输入的时间减去现在的时间就是剩余的时间,即倒计时,但是不能拿着时分秒相减,比如05分减去25分,结果会是负数
// 2.用时间戳来做。用户输入时间总的毫秒数减去现在时间的总的毫秒数,得到的就是剩余时间的毫秒数
// 3.把剩余时间总的毫秒数转换为天、时、分、秒(时间戳转换为时分秒)
function countDown(time) {
var nowTime = +new Date(); // 返回的是当前时间总的毫秒数
var inputTime = +new Date(time); // 返回的是用户输入时间总的毫秒数
var times = (inputTime - nowTime) / 1000; // 返回的是剩余时间总的秒数 除以1000 是将毫秒变为秒
var d = parseInt(times / 60 / 60 / 24); // 天
d = d < 10 ? '0' + d : d;
var h = parseInt(times / 60 / 60 % 24); // 小时
h = h < 10 ? '0' + h : h;
var m = parseInt(times / 60 % 60); // 分钟
m = m < 10 ? '0' + m : m;
var s = parseInt(times % 60); // 秒
s = s < 10 ? '0' + s : s;
return d + '天' + h + '时' + m + '分' + s + '秒';
}
console.log(countDown('2022-12-1 20:00:00'));
3 数组对象案例
筛选数组
// 有一个包含工资的数组[1500,1200,2000,2100,1800],要求把数组中的工资超过2000的删除,剩余的放到新数组里面
var arr = [1500,1200,2000,2100,1800];
var newArr = [];
for(var i = 0; i < arr.length; i++) {
if (arr[i] < 2000) {
// newArr[newArr.length] = arr[i];
newArr.push(arr[i]);
}
}
console.log(newArr);
★★数组去重★★
// 有一个数组['c','a','z','a','x','a','x','c','b'],要求去除数组中重复的元素
// 案例分析:
// 1.目标:把旧数组里面不重复的元素选取出来放到新数组中,重复的元素只保留一个,放到新数组中去重
// 2.核心算法:我们遍历旧数组,然后拿着旧数组元素去查询新数组,如果该元素在新数组里面没有出现过,我们就添加,否则不添加
// 3.我们怎么知道该元素有没有存在?利用新数组.indexOf(数组元素) 如果返回-1就说明新数组里面没有该元素
// 封装一个去重的函数 unique 独一无二的
function unique(arr) {
var newArr = [];
for (var i = 0;i < arr.length; i++) {
if(newArr.indexOf(arr[i]) === -1) {
newArr.push(arr[i]);
}
}
return newArr;
}
var demo = unique(['c','a','z','a','x','a','x','c','b']);
console.log(demo);
4 字符串对象案例
返回字符位置
// 查找字符串"abcoefoxyozzopp"中所有o出现的位置以及次数
// 1.核心算法:先查找第一个o出现的位置
// 2.然后只要indexOf返回的结果不是-1,就继续往后查找
// 3.因为indexOf只能查找到第一个,所以后面的查找,利用第二个参数,当前索引加1,从而继续查找
var str = 'abcoefoxyozzopp';
var index = str.indexOf('o');
var num = 0;
while (index !== -1) {
console.log(index);
num++;
index = str.indexOf('o', index + 1);
}
console.log('o出现的次数是:' + num);
// 课后作业
// ['red','blue','red','green','pink','red'],求red出现的位置和次数
var arr = ['red','blue','red','green','pink','red'];
var index = arr.indexOf('red');
var num = 0;
while (index !== -1) {
console.log(index);
num ++;
index = arr.indexOf('red', index + 1);
}
console.log('red出现的次数是:' + num);
统计出现最多的字符和次数
//判断一个字符串'abcoefoxyozzopp'中出现次数最多的的字符,并统计其次数
// 1.核心算法:利用charAt()遍历整个字符串
// 2.把每个字符都存储给对象,如果对象没有该属性,就为1,如果存在了就+1
// 3.遍历对象,得到最大值和该字符
var str = 'abcoefoxyozzopp';
var o = {};
for (var i = 0; i < str.length; i++) {
var chars = str.charAt(i); // chars是字符串的每一个字符
if(o[chars]) {
// o[chars]得到的是属性值
o[chars]++;
} else {
o[chars] = 1;
}
}
console.log(o);
//遍历对象
var max = 0;
var ch = '';
for (var k in o) {
// k得到的是属性名
// o[k]得到的是属性值
if(o[k] > max) {
max = o[k];
ch = k;
}
}
console.log(max);
console.log('出现最多的字符是:'+ ch);
综合作业题
// 给定一个字符串,如:'abaasdffggghhjjkkgfddsssss3444343',问题如下:
var str = 'abaasdffggghhjjkkgfddsssss3444343';
// 1.字符串的长度
console.log('字符串长度为:' + str.length);
// 2.取出指定位置的字符,如:0,3,5,9等
console.log('索引为0的字符为:' + str.charAt(0));
console.log('索引为3的字符为:' + str.charAt(3));
console.log('索引为5的字符为:' + str.charAt(5));
console.log('索引为9的字符为:' + str.charAt(9));
// 3.查找指定字符是否在以上字符串中存在,如:i,c,b等
if(str.indexOf('i') !== -1) {
console.log('i在以上字符中存在!');
} else{
console.log('i在以上字符中不存在!');
}
if(str.indexOf('c') !== -1) {
console.log('c在以上字符中存在!');
} else{
console.log('c在以上字符中不存在!');
}
if(str.indexOf('b') !== -1) {
console.log('b在以上字符中存在!');
} else{
console.log('b在以上字符中不存在!');
}
// 4.替换指定的字符,如:g替换为22, ss替换为b等操作方法
console.log('g替换为22后字符串变为:' + str.replace('g','22'));
console.log('ss替换为b后字符串变为:' + str.replace('ss','b'));
// 5.截取指定开始位置到结束位置的字符串,如:取得1-5的字符串
console.log('截取索引号1-5的字符串为:' + str.slice(1,5));
// 6.找出以上字符串中出现次数最多的字符和出现的次数
var o = {}; // 定义一个空对象
for (var i = 0; i < str.length; i++) {
var chars = str.charAt(i); // chars是遍历后的每一个字符
// 如果字符不存在,属性值为1;如果存在那么属性值加1
if (o[chars]) {
o[chars]++;
} else {
o[chars] = 1;
}
}
console.log(o); //输出对象o
// 遍历对象
var max = 0; // 定义一个最大值,初始值为0
var ch = ''; // 定义一个空字符串
// 开始遍历
for (var k in o) {
if (o[k] > max) {
max = o[k]; // 将o[k]属性值赋值给max
ch = k; // 将k属性名赋值给ch
}
}
console.log(max);
console.log('出现次数最多的字符是:' + ch);