数组定义
var arr = []
或者用var arr = new Array(数字)
来创建一个空数组
定义带数据的数组:
var arr = ['张三','李四','王五','赵六']
或者用:
var arr = new Array('张三','李四','王五','赵六')
数组和对象不同,数组中是有排序的。这两种定义数组的方式,在定义带数据的数组时是基本一样的,但是在定义空数组时,前者定义的是一个全空的数组,后者则是按照你书写的数字的多少留出多少空的空间,也就是说前者的数组长度是0,后者是你填的数字。
例如:
<script>
var arr = new Array(5);
console.log(arr);
</script>
结果:
数组的几个细节:
- 数组可以存放的数据类型是没有限制的,可以存放任意数据类型的数据。
- 数组中小空间的编号,永远都是从0开始,一次向后递增的,数组中第一个小空间的编号,永远是0。
- 数组中最后一个小空间的编号,永远都是 数组中数据的个数-1。
数组的基本操作
1.检测数组中值的个数,可以用数组.length
来实现
<script>
var arr = ['a','b','c','d','abcd']
console.log(arr.length)
</script>
2.访问数组中的元素:数组[下标]
来实现
var arr = ['a', 'b', 'c', 'd', 'abcd']
console.log(arr[2]); //按照索引的数字 输出字符串c
同样的你也可以用这样的表达方式来实现数组值得输出:
var arr = ['a', 'b', 'c', 'd', 'abcd']
console.log(arr[arr.length - 1]); //按照索引的数字 输出字符串abcd
用长度-数字的方式输出。
3.添加和修改数组内元素
修改和添加都是用同样的代码来实现的:数组[下标] = 值
,但是修改与添加不同的是,如果你写的下标是在原本数组长度-1之外的数字,那就是添加。
例如:
<script>
var arr = ['a', 'b', 'c', 'd', 'abcd']
arr[5] = '我是新的元素';
console.log(arr);
</script>
如果写的数字比数组长度还要要大,那么数组会用空的元素来填充中间的空间直到你写的那个数值。
例如:
<script>
var arr = ['a', 'b', 'c', 'd', 'abcd']
arr[10] = '我是新的元素';
console.log(arr);
</script>
则会显示如下:
修改元素,则是数字小于数组长度,则新赋的值会覆盖原本的值:
<script>
var arr = ['a', 'b', 'c', 'd', 'abcd']
arr[3] = '我是新的元素';
console.log(arr);
</script>
结果如下:
4.删除元素
删除元素的方法有:1.删除元素delete 数组[下标]
例如:
var arr = ['a', 'b', 'c', 'd', 'abcd']
delete arr[3];
console.log(arr);
但是,这一种方式只能删除,数组的某一索引所占有的值,并不能删除空间。被删除的值,会用空白填补(empty)。
想要删除空间,或者扩展空间要用改变数组的长度的方法:
- 若改变的长度小于数组原本的长度,那么原本数组多出来的空间就会被删减。
var arr = ['a', 'b', 'c', 'd', 'abcd']
arr.length = 3;
console.log(arr);
结果如下:
- 而如果改变的长度是多于数组原本的长度,则会拓展空间,多出来的用空元素补上。
var arr = ['a', 'b', 'c', 'd', 'abcd']
arr.length = 10;
console.log(arr);
数组的遍历(重要)
利用循环输出数组中的每一个值:
var arr = ["张三","李四","王五","赵六"];
var length = arr.length;
for(var i=0;i<length;i++){
console.log(arr[i]);
}
在对象中用的for in也可以用来遍历数组:
var arr = ["张三","李四","王五","赵六"];
for(var i in arr){
console.log(arr[i]);
}
但是二者也有区别,前者在遍历空元素时会输出值undefined,而后者不会遍历空元素。
其次,在遍历下标时,for in 的输出是字符串,而for循环的输出是数字类型。(重要)
数组操作的基本方法
1.unshift --- 给数组开头添加一个或者多个元素,返回值为数组的新长度
语法:数组名字.unshift(要添加的元素,一个或者多个用逗号隔开)
示例:
var arr = ['a', 'b', 'c'];
var res = arr.unshift(1,2,3);
console.log(arr);
console.log(res);
2.push --- 给数组的结尾添加一个或者多个元素,返回值为数组新长度
语法:数组名字.push(要添加的元素,一个或者多个用逗号隔开)
示例:
var arr = ['a', 'b', 'c'];
var res = arr.push(1,2,3);
console.log(arr);
console.log(res);
3.shift --- 删除数组的第一个元素 ,返回值为被删掉的元素
语法:数组名字.shift()
示例:
var arr = ['a', 'b', 'c'];
var res = arr.shift()
console.log(arr);
console.log(res);
4.pop --- 删除数组最后一个元素 ,返回值为被删掉的元素
语法:数组名字.pop()
var arr = ['a', 'b', 'c'];
var res = arr.pop()
console.log(arr);
console.log(res);
5.splice --- 对数组做增、删、改的操作(不需要返回值)
语法:数组名字.splice(要删除元素的开始下标,要删除的个数,要添加的元素一个或者多个用逗号隔开)
注意:要添加的元素可以不写,如果不写则是执行删除的操作,与delete不同它是直接删除空间而不是元素,会改变数组长度。
示例:
var arr = ['a', 'b', 'c','d','e','f'];
arr.splice(2,2,'我是新元素');//从c开始向后删除了两个元素,添加一个新元素
console.log(arr);
6.concat --- 数组的拼接,返回值为拼接后的数组
语法:数组名字.concat(要拼接的数组名字一个或者多个用逗号隔开)
示例:
var arr = ['a', 'b', 'c','d','e','f'];
var brr = [1,2,3,4]
var crr = [true,function(){console.log(a);}]
console.log(arr.concat(brr));
console.log(arr.concat(brr,crr));
7. sort - 将数组按照首位大小排序,返回值为排序后的数组
语法:数组名字.sort()
示例:
var arr = [2,4,5,2,3,8,6,9,31,12,32,56,7];
console.log(arr.sort());
8.reverse --- 将数组的元素排序反转,返回值为新排序的数组
语法:数组名字.reverse()
示例:
var arr = [1,2,3,4,5,6,7,8,9];
console.log(arr.reverse());
9.slice --- 截取数组,返回值为截取过后的新数组
语法:数组名字.slice(开始的下标,结束的下标)
,注意:结束下标所对应的元素不会被截取到新的数组当中,所以在截取时应该写截取目标元素的下标+1作为结束的额下标。
示例:
var arr = [1,2,3,4,5,6,7,8,9];
var res = arr.slice(3,6);//截取了4 5 6三个元素
console.log(res);
冒泡排序
冒泡排序的原理就是将两个相邻的数组元素做比较,用大小判断循环的交换他们的位置,最后实现排序的效果。
var arr = [3, 1, 4, 7, 9, 2, 6, 5, 8]
console.log(arr);
for (var j = 0; j <= arr.length - 1; j++) {
// 重复排序操作 length-1次即可
for (var i = 0; i <= arr.length - 1 - j; i++)
//遍历数组,因为虽然数组的长度为9,但是比较数据这个操作只用做8次即可
{
if (arr[i] > arr[i + 1]) {
// 条件为真交换数据
var container = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = container;
}
}
}
console.log(arr);
选择排序
选择排序的原理,就是假设一个最大数字的下标并用它和别的元素比较,用大小判断改变两个元素的位置最后达到排序的效果。
var arr = [2, 1, 22, 3, 24, 4];
for (j = 0; j < arr.length - 1; j++) {
for (var i = j + 1; i < arr.length; i++) {
if (arr[j] > arr[i]) {
var container = arr[i];
arr[i] = arr[j];
arr[j] = container;
}
}
}
console.log(arr);
数组去重
- 用delete方法去重
var arr = [1,1,1,1,1,1,2]
for(var i=1; i<arr.length; i++) {
// arr[i]代表遍历出来的所有元素
if(arr[0] === arr[i]) {
// 将arr[i]删除 - 数组.splice(开始下标, 1)
arr.splice(i, 1)
i-- // 因为下一个元素的下标会向前移动一位,所以需要判断下一个元素的话,就需要让他的下标-1
}
}
console.log(arr);
- 将不重复的元素都放在一个空数组中
for(var i=1; i<arr.length; i++) {
// arr[i]是arr中的每个元素
// 要判断每个元素是否在brr中 - 需要遍历brr
for(var j=0; j<brr.length; j++) {
if(arr[i] === brr[j]) {
// 说明brr中已经有了arr[i]了 - 不放
break;
}
}
// 如果上面循环结束了,if也没有成立过一次,就放进去
if(j === brr.length) {
brr.push(arr[i])
}
}
console.log(brr);
- 利用对象中的键是不重复的(有意思)
var arr = [1,1,2,2,2,3,3,6,6,9,5,5,1,1,1,1];
var obj = {}
// 遍历数组,将每个元素都作为对象的键 - 值随意
for(var i=0; i<arr.length; i++) {
// arr[i] 是每个值 - 当做obj的键放在obj中
obj[ arr[i] ] = typeof arr[i]
}
console.log(obj);
// 将对象中所有键都放在一个数组中
var brr = [] // 定义空数组
// 遍历对象得到所有的键,将所有的键都放在brr中
for(var i in obj) {
brr.push( obj[i] === 'number' ? Number(i) : i )
}
console.log(brr);