数组
概念
数组就是一系列有序数据的集合
1、数组中每个值,称之为一个“数组元素”;
2、数组元素可以是任意类型的数据
创建数组
1、使用new关键字和Array()来创建一个数组(了解)
构造函数方式
var arr = new Array(元素1,元素2,元素3,.....,元素N);
例:创建一个包含五个元素的数组
// 创建方式1
// new Array(元素1,元素2,元素3.....)
// 数组元素时字符串就 ''
// 数字则不用
var arr1 = new Array('huahua',18,'boy','china','latiao');
console.log(arr1);
2、使用中括号[]来创建数组(推荐)
字面量方式
var arr = [元素1,元素2,元素3,...,元素N];`
例:创建数组有五个元素
//元素的个数不限
// 元素之间使用','隔开
var arr2 = ['weilong',2.5,'luohe','latiao','面筋'];
console.log(arr2);
脚下留心
1、new 和 Array关键字,Array 首字母大写
2、数组元素可以写多个,多个之间用逗号隔开“,”
3、var arr = new Array[]; 错误的写法
数组索引
1、数组每个元素都对应一个“编码”,通过这个“编号”可以获取指定元素的值.
2、数组元素对应的“编号”,通常称之为“数组下标”或“数组索引”.
[外链图片转存失败(img-yBr2dVHH-1568548462703)(/1560425577003.png)]
脚下留心:
1 数组元素下标从0开始.
2 最大的下标是数组长度-1
// arr[元素1,元素2,元素3.....]
var arr2 = ['weilong',2.5,'luohe','latiao','面筋'];
// 根据下标获取指定元素
console.log(arr2[2]);
例1 :创建一个数组,存入[1,4,5,6,7],并且取出下标为2的,新增下标为8的数据,修改下标为3的数据
<script>
// 创建一个arr数组
var arr = [1,4,5,6,7];
console.log(arr);
// 获取下标为2的元素
console.log(arr[2]); // 5
// 给数组arr添加下标为8的元素
arr[8] = '新增的元素';
console.log(arr);
// 修改数组arr下标为3的元素
arr[3] = '修改下标为3的元素';
console.log(arr);
</script>
总结
1 可以手动为数组指定不存在的下标的值.
2 如果索引对应的值,已存在,再次给其赋值,就是覆盖前面的;
遍历数组,使用for()
使用length获取数组的长度
var arr = [1,2,3,4,5,6,7,8,9,10];
// 获取数组的长度length
console.log(arr.length); // 10
例1:var arr = [1,2,3,4,5,6,7,8,9,10]; 求出这个数组的和
// 声明变量存储和
var sum =0;
for(var i=0;i<arr.length;i++){
// 循环输出所有的元素
// console.log(arr[i]);
//让数组的每一个元素想加
sum+=arr[i];
}
console.log(sum);
数组的赋值方式
1.静态赋值:直接使用指定的值给指定位置的数组
arr[0] = 1
arr[1] = "hello"
2.动态赋值:在程序运行过程中,创建具体的值给元素赋值
arr[0] = Math.random();
arr[1] = Math.random();
数组对象的属性和方法
数组属性
属性名 | 描述 |
---|---|
length | 获取数组元素长度,如:arr.length 注:最大下标值,数组长度-1 |
数组的方法
方法名 | 描述 |
---|---|
arr.sort(); | 给数组排序,先数字后英文再中文 |
arr.reverse(); | 反转数组元素 |
arr.join(str); | 将数组划分为字符串,数组元素以str分隔(默认是逗号) |
arr.concat(arr1,arr2,…,arr3); | 合并数组,可以是多个,多个之间用逗号隔开“,” |
arr.pop(); | 弹出arr数组最后一个元素,返回弹出的元素值 |
arr.push(data); | 给arr数组最后添加一个data元素,返回新数组的长度 |
arr.shift() | 弹出arr数组第一个元素,并反弹出的元素值 |
arr.unshift(data); | 给arr数组最前面添加一个data元素,返回新数组的长度 |
arr.slice(start,end) | 分割数组,返回arr中start到end之间的元素 |
例1:数组的各种操作
var arr = ['cangjinkong',28,'心中',165,58];
var arr2 = ['凤姐',45];
// 获取数组的长度
//console.log(arr.length);
var arr1 = [7,4,5,9,3,2,8];
// arr1 = new Array();
// 实现数组的排序
// console.log(arr1.sort());
// 数组的反转
// console.log(arr1.reverse());
// 数组变为字符串
//console.log(arr1.join('-'));
// 数组的合并
// console.log(arr1.concat(arr,arr2));
//弹出数组的最后元素
// console.log(arr1.pop());
//向数组最后添加元素,返回长度
// console.log(arr1.push(10));
// console.log(arr1);
// 弹出第一个元素
// console.log(arr1.shift());
// 给数组前面添加一个元素
// console.log(arr1.unshift(0));
// console.log(arr1);
//分割数组
console.log(arr1.slice(0,3));
整数数组/字符串数组/对象数组/二维数组
整数数组:arr = [1,2,3,4,5,6,7]
数组的元素为整数
字符串数组:arr = ["h","e","l","l","o”]
数组的元素为字符串
对象数组:arr = [{name:"Lisa"},{name:"Jack"},{name:"Loss"}]
数组的元素为对象
如何获取对象数组内的元素:arr[1].name; //Jack
例: 创建一个对象数组用于保存商品的信息
二位数组
数组元素可以是任意类型,如果其中一个元素依旧是数组,我们称之为多维数组
var arr = [
元素1,
[元素1,元素2,元素3],
元素3,
元素4
]
脚下留心
1、元素和元素之间用逗号隔开(,)最后一个元素不用加“,”
2、多维数据理论上可以有N层,在实际工作中一般三层,称之为:三维数组
操作多维数组
获取元素:数组名[一维数组下标][二维数组下标],如:arr[1][1];
增加元素:数组名[一维数组下标][新增的二维数组下标],如:arr[1][8]
修改元素:数组名[一维数组下标][已存在的二维数组下标],如:arr[1][4]
例:创建一个二维数组,通过下标修改值
<script>
// 创建一个二维数组
var arr = [
1,
[8,2,3,4,5],
[8,2,3,4,5],
4,
5
];
// 如何操作二维数组
// 将下标为4的元素值改为:8
console.log(arr[4]);
arr[4] = 8;
console.log(arr);
// 修改arr下标为1的元素
console.log(arr[1]); // [8, 2, 3, 4, 5]
var arr2 = arr[1];
// 获取arr2下标为1的元素值
console.log(arr2[1]);
综合应用
1.定义一个30项的数组,数组的每一项要求是1-10的随机数.
var arr = [];
for(var i=0;i<30;i++){
// console.log(i);
// 随机数的生成.乘以10得到个位数,再向上取整
// 0.01--0.99 * 10 ====0.1----9.9向上取整====1-10
var num = Math.ceil(Math.random()*10);
// console.log(num);
// 此时拿i当数组的索引,每次循环数组的元素都变化
// 给循环到每个数组下标,动态赋值
//arr[0] = 1;
// arr[1] = 4;
//arr[2] = 5
//....
//arr[28] = 9;
// arr[29] = 8;
arr[i] = num;
}
console.log(arr);
2.通过循环制造一个5 x 5的二维数组,保存5个商品信息(名称,价格,品牌),并将第二个商品的信息拼接为字符串输出.
var arr = [];
for(var i=0;i<5;i++){
// arr[i] = i;
// 直接给每个元素赋值一个数组
// 2 给二维数组中填充内容
arr[i] = ['goods','price','brand','category','description'];
}
// 拼接第二个商品的信息
var goodsInfo = '商品名称'+arr[1][0]+'价格'+arr[1][1]+'品牌'+arr[1][2]+'分类'+arr[1][3]+'描述'+arr[1][4];
第三节
for-in循环
问题:
在使用for遍历数组的过程中,需要至少确定数组的长度,以判断遍历的次数
但如果遇到数组的元素个数不确定的情况,就不适合使用for循环遍历了
解决办法:
新的遍历方式:for-in循环
例1: 使用for-in循环数组
// n表示是数组的索引
var arr = [1,1,2,3,5,8,13,21,34];
for(var n in arr){
console.log(arr[n]);
}
注意:for-in循环一般用来遍历非数组对象
例2:使用for-in循环对象(了解)
for-in循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作。我们也称这种循环为“枚举”。
var obj = {
name:"lz",
age:36
}
for(var i in obj){
console.log(obj[i]);
}
数组的排序(冒泡/选择)
依次对数组中相邻数字进行比较(两两比较),大的放后面
var arr = [45,12,7,36,2];
var arr = [5,99,2,9,1,5,67,7,10,23]; //定义一个杂乱的数组
for(var i=0;i<arr.length-1;i++){ //大循环,用于遍历数组每个元素
for(var j=0;j<arr.length-i-1;j++){ //小循环,用于将数组中的某个元素与其它所有元素相比较
var sum; //声明一个局部变量,当作第三个空瓶子
if(arr[j]>arr[j+1]){ //判断当前元素和后一个元素的大小,如果当前元素比后一个元素大
sum = arr[j+1]; //将后一个元素(小元素)放在空瓶子里
arr[j+1] = arr[j]; //将当前元素(大元素)放在后一个元素的位置
arr[j] = sum; //将小元素从空瓶子中拿出来,放在当前元素的位置
}
}
}
console.log(arr); //完成循环之后,初始数组的顺序已经发生改变
选择排序:
将第一位依次与后面的元素相比较,得到最小值,与第一位交换。再用第二位依次与后面元素相比较,得到最小值,与第二位交换。
从原始数据中找到最小元素,并放在数组的最前面。然后再从下面的元素中找到最小元素,放在之前最小元素的后面,直到排序完成
[外链图片转存失败(img-dLFP6nYI-1568548462705)(/1560432764055.png)]
var arr = [5,99,2,9,1,5,67,7,10,23]; //定义一个杂乱的数组
for(var i=0;i<arr.length-1;i++){//大循环,需要比对的次数
var min = arr[i];//假定一个最小值
var minIndex = i;//假定最小值的索引
for(var j=i+1;j<arr.length;j++){//小循环,每次需要比对的次数
if(min>arr[j]){//判断最小值是否为真的最小值
min = arr[j];//获取真正的最小值
minIndex = j;//获取真正最小值的索引
}
}
arr[minIndex] = arr[i];//将当前元素放在最小值的位置
arr[i] = min;//将最小值放在当前元素的位置
}
console.log(arr);//输入排序好的数组
栈和堆
每个内存单元中分为两个部分,栈和堆
栈内存主要用于存储各种基本类型的**变量,包括Boolean、Number、String、Undefined、Null,**以及对象变量的指针,这时候栈内存给人的感觉就像一个线性排列的空间,每个小单元大小基本相等。
优点:存取速度比堆快,仅次于直接位于CPU中的寄存器,数据可以共享;
缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性
堆内存: 动态分配的内存,大小不定也不会自动释放,存放引用类型,指那些可能由多个值构成的对象,保存在堆内存中,包含引用类型的变量,实际上保存的不是变量本身,而是指向该对象的指针。
引用类型:Function,Array,Object
[外链图片转存失败(img-HfIZqodZ-1568548462705)(/1560433566182.png)]
例1:new 两个数组比较
var a = new Array(1,2);
var b = new Array(1,2);
console.log(a==b, a===b)
>>> false false
如果a,b是存储在栈内存中的话,两者应该是明显相等的,就像null === null是true一样,但结果两者并不相等,说明两者都是存储在堆内存中的,指针指向不一致。
对象的本质和意义
常规对象:
var obj = {
name:"lz",
age:36,
skill:function(){
console.log(1)
}
}
解释: 对象的本质就是key和value,如下
obj的key为name / age
obj的value为"lz" / 36
key和value一一对应
键就是key,值就是value
数组(Array),对象(Object)都是对象
Array()类
var arr = new Array();
var arr2 = new Array();
属性
对象.length 获取数组的长度
方法
对象.pop() 弹出数组的最后一个元素,并返回弹出的值
对象.push(n); 给数组添加一个元素,并返回新数组的长度
上面的常规对象其实等价于:
var obj = new Object();
obj.name = "lz";
obj.age = 36
obj.skill = function(){
console.log(1);
}
外面的变量对应对象身上的属性
外面的函数对应对象身上的方法
通过"."(点),当这个属性名是具体的值的时候
对象就是其中包含了很多的属性和方法,可以通过对象的名字进行调用.对象相当于手机,里面有很多功能,想要使用功能必须有手机.
JSON表示对象的方法
什么是json
JSON是独立的语言
JSON 是用于存储和传输数据的格式,通常用于服务端向网页传递数据
JSON 语法规则
-
数据为 键/值 对。
-
数据由逗号分隔。
-
大括号保存对象
-
方括号保存数组
-
json中键也要用引号引起来
例1:使用json对象保存一个人的信息,包括name,sex,age
var json_str = {"name":"张三", "sex":"男","age":16};
例2:通过json表示多个人的信息
var json_arr = [ {"name":"张三", "sex":"男","age":16} {"name":"李四", "sex": "公", "age": 18}, {"name":"战三", "sex": "公", "age": 18} ]; 在以上实例中,"json_arr" 是一个数组,包含了三个对象。
解释:
中国通用语言:普通话 计算机语言中的通用数据:JSON,是计算机各种语言之间数据沟通的桥梁
例3: json对象成员的使用,添加方法
var demo = { "name":'zs', "age":18, "eat":function(){ alert(1234); } } console.log(demo.name); console.log(demo.eat()); 可以像对象那样调用属性和方法
随机点名程序
// 目标:随机点名程序,每次输出一个学生的名字
// 1 声明一个包含姓名的数组
var arr = ["刘超","晶晶","徐文","老王","李冬冬","沈杭"];
// 2 随机数范围:随机数*length,parseInt()取整
// 获取数组长度
var len = arr.length;
// 最大随机数0.99*12 = 11.99 // 最小随机数 0.01*12 = 0.12
var num = parseInt(Math.random()*len);
console.log(num);
//3 数组中的下标用随机数生成,然后输出随机的元素
var stu = arr[num];
document.write('<h3>恭喜:'+stu+'喜提棒棒糖一枚<h3>');
总结:
声明数组:
var arr = new Array();
var arr = [1,2,3,5];
数组的索引
索引下标从0开始,
arr.length 数组的长度
最大索引值 = 数组长度-1;
数组的遍历
for(var i;i<=arr.length-1;i++){
arr[i]
}
// n是数组的索引
for(var n in arr){
arr[n]
}
数组的方法:
arr.sort()
arr.push()
arr.pop();
arr.reverse()
arr.join()
二维数组
arr = [1,2,[9,8],9,[]]
arr = [1,2[8,10,[0
,2]],4]
堆:存放object等复合数据类型
栈:基本数据类型
json对象
var json = {‘name’:‘zs’,‘age’:18}
json与常见对象区别:
键要有引号引起来
随机点名程序:
第四节: 练习与应用
1.编写函数map(arr) 把数组中的每一位数字都增加30%
2.编写函数has(arr , 60) 判断数组中是否存在60这个元素,返回布尔类型
作业
1.编写函数norepeat(arr) 将数组的重复元素去掉,并返回新的数组(看情况写)
var myarr = ["a","b","c","c","b","a","d","f","f","a","b","c"];
console.log(myarr)
function norepeat(arr){
var obj = {}
for(var i=0;i<arr.length;i++){
var attr = arr[i];
if(!obj[attr]){
obj[attr] = 1
}else{
obj[attr]++
}
}
//// console.log(obj)
var sArr = []
for(var i in obj){
sArr.push(i)
}
console.log(sArr)
return sArr;
}
console.log(norepeat(myarr))
2.使用JSON形式创建一个对象,该对象存储一个学生的信息,该对象包含学号、身份证、年龄、性别、所学专业等属性信息,同时该对象包含一个自我介绍的方法,用来输出该对象的所有信息
var arr = [{
name:"admin",
age:18,
sex:1,
show:function(){
console.log("我叫:"+arr[0].name+",我今年:"+arr[0].age+"岁,")
}
},{
name:"root",
age:16,
sex:0,
show:function(){
console.log("我叫:"+arr[1].name+",我今年:"+arr[1].age+"岁,")
}
}]
arr[0].show()
arr[1].show()
扩展案例:
以下是某班级一次考试的成绩表。请计算每个学生总成绩,并按总成绩排名。统计各单科成绩第一名,输出其成绩与学号。
arr)
function norepeat(arr){
var obj = {}
for(var i=0;i<arr.length;i++){
var attr = arr[i];
if(!obj[attr]){
obj[attr] = 1
}else{
obj[attr]++
}
}
//// console.log(obj)
var sArr = []
for(var i in obj){
sArr.push(i)
}
console.log(sArr)
return sArr;
}
console.log(norepeat(myarr))
2.使用JSON形式创建一个对象,该对象存储一个学生的信息,该对象包含学号、身份证、年龄、性别、所学专业等属性信息,同时该对象包含一个自我介绍的方法,用来输出该对象的所有信息
var arr = [{
name:"admin",
age:18,
sex:1,
show:function(){
console.log("我叫:"+arr[0].name+",我今年:"+arr[0].age+"岁,")
}
},{
name:"root",
age:16,
sex:0,
show:function(){
console.log("我叫:"+arr[1].name+",我今年:"+arr[1].age+"岁,")
}
}]
arr[0].show()
arr[1].show()
扩展案例:
以下是某班级一次考试的成绩表。请计算每个学生总成绩,并按总成绩排名。统计各单科成绩第一名,输出其成绩与学号。
[外链图片转存失败(img-KhL0gMe6-1568548462705)(/1560476485727.png)]