数据结构与算法的JS描述
2.9 练习
\1. 创建一个记录学生成绩的对象,提供一个添加成绩的方法,以及一个显示学生平均成绩
的方法。
function Student(){
this.gradeStore = [];
this.add = add;
this.average = average;
}
//添加成绩
function add(grade){
this.gradeStore.push(grade);
}
//求平均分
function average(){
var total = 0;
for(var i=0; i<this.gradeStore.length; i++){
total += this.gradeStore[i];
}
return total/this.gradeStore.length;
}
var stud = new Student();
stud.add(11);
stud.add(33);
stud.add(44);
console.log(stud.average().toFixed(2));
\2. 将一组单词存储在一个数组中,并按正序和倒序分别显示这些单词。
var words = ["domain", "apple", "scope", "abandon", "console"];
print(words.sort());
print(words.reverse());
\3. 修改本章前面出现过的 weeklyTemps 对象,使它可以使用一个二维数组来存储每月的有
用数据。增加一些方法用以显示月平均数、具体某一周平均数和所有周的平均数。
function monthTemps(){
//初始化月数据,4周,1周7天
this.monthData = (function weekData(){
var data = [];
for(var i =0; i<4; i++){
var week=[];
for(var j=0; j<7; j++){
week[j] = 0;
}
data[i] = week;
}
return data;
})();
this.addMonthData = addMonthData;
this.monthAverage = monthAverage;
this.weekAverage = weekAverage;
this.allWeekAverage = allWeekAverage;
}
//添加数据,第几周第几天,添加的数据
function addMonthData(week,day,data){
this.monthData[week][day] = data;
}
//月平均
function monthAverage(){
var total = 0;//统计月总数据
var week = 0;//统计几周
for(var i=0; i<this.monthData.length; i++){
for(var j=0; j<this.monthData[i].length; j++)
total += this.monthData[i][j];
week++;
}
return total/(this.monthData.length*week);
}
//一周平均
function weekAverage(week){
var total = 0;
var day = 0;//记录天数
for(var i=0; i<this.monthData[week].length; i++){
total += this.monthData[week][i];
day++;
}
return total/day;
}
//所有周平均
function allWeekAverage(){
var total = 0;
for(var i=0; i<this.monthData.length; i++){
for(var j=0; j<this.monthData[i].length; j++){
total += this.monthData[i][j];
}
}
return total/this.monthData.length;
}
var month_data = new monthTemps();
month_data.addMonthData(0,0,44);
month_data.addMonthData(1,1,14);
month_data.addMonthData(2,2,22);
month_data.addMonthData(3,3,33);
month_data.addMonthData(2,2,55);
month_data.addMonthData(2,6,55);
print("week1: ",month_data.monthData[0]);
print("week2: ",month_data.monthData[1]);
print("week3: ",month_data.monthData[2]);
print("week4: ",month_data.monthData[3]);
print("monthAverage: ",month_data.monthAverage().toFixed(2));
print("week3Average: ",month_data.weekAverage(2).toFixed(2));
print("allWeekAverage: ",month_data.allWeekAverage().toFixed(2));
\4. 创建这样一个对象,它将字母存储在一个数组中,并且用一个方法可以将字母连在一
起,显示成一个单词。
function Str(){
this.words = ["a", "p", "p", "l","e"];
this.toStr = toStr;
}
function toStr(){
return this.words.join('');
}
var obj = new Str();
print(obj.toStr());
第二章总结:
-
split()
-
浅拷贝 新数组指向原来的数组
深拷贝 复制原数组中的每一个值到新数组 -
indexOf()返回第一个索引 lastIndexOf()返回最后一个索引
-
数组的字符串表示
join() toString()返回字符串,元素默认以逗号隔开 -
由已有数组创建新数组
concat()合并
splice(start,length,插入或删除的项)截取
splice()length 为0只插入, 大于0删除,返回删除项,有第三个参数会插入数组 -
为数组添加元素
push()尾 unshift()首 -
删除数组元素
pop() shift() -
为数组排序
reverse()反转
sort()按字典顺序排序 -
不产生新数组 数组的迭代器方法
forEach() every()
forEach()接收一个函数作为参数,对数组中每个元素执行该操作every()该方法接受一个返回值为布尔类型的参数,对数组中每个元素执行函数
如果所有元素应用该函数均返回true,则every()返回truesome()同every(),但存在则返回true
reduce() 接收一个函数,返回一个值,该方法从一个累加值开始,
不断对累加值和数组中的后续元素调用该函数,直到遇到数组的最后一个元素,返回累加值
reduceRight()从右向左执行 -
生成新数组的迭代器方法
map() filter()
map()对数组的每一项进行操作,然后返回一的新的数组
该数组是对原有数组应用某个函数得到的结果,参数为函数名filter()传入一个返回值为布尔型的函数,当数组中所有元素应用该函数
结果均为true时,返回一个新数组,新数组包含所有为true的元素